PostgreSQL NULL value cannot be found [duplicate] - sql

This question already has answers here:
postgresql NOT ILIKE clause does not include null string values
(2 answers)
Closed 7 months ago.
select * from test;
select * from test where name not in ('amtf');
Why?

As others have said, the problem here is, that you're comparing against a null value, so it returns nothing, because it considers it as false, and I'll go even further that even if you say where name <> 'admf' it wont work, and even if you add more rows it will ignore the null row, and it's not just in PostgreSQL, it doesn't work in SQL-Server or MySQL either.
As you can see in these db<>fiddles SQL-Server, MySQL, and PostgreSQL.
And the reason why it doesn't work is, because you're saying name should not equal a specific value. First name needs to be a value it should not be equal to a value, but when name is null it doesn't have a value, and even more for a side note null itself is not equal null.
The way to solve it is to convert it to a empty string by using COALESCE(name,'') or in SQL-Server you can also use isnull(name,''), and then compare it, or you can add or name is null which will return you all rows, including null, where name <> 'some value'.

Well the condition is right and the response for that as soo .
select * from test where name not in ('amtf');
your query is saying : give me all the records that the name Column is not in ('amtf').
you have 2 column's on is amtf and the other is null.
amtf will no be brought because of the condition and the other column is null -> no name set

Related

Keep null rows after filtering [duplicate]

This question already has answers here:
SQL not displaying null values on a not equals query?
(5 answers)
Closed 20 hours ago.
Before select
Status could be:
X1, X2, NULL
SELECT * FROM surrtest t Where t.Status != „X2“
It’s deleting also rows where Status was null. But it shouldn’t.
So after query I’m only getting rows where status Is X1 but I also want the NULL rows.
Is it possible?
I don’t know if it’s possible. If not maybe there is a workaround where we replace the null values with empty strings? But I hope it is possible without changing the data.
This should work:
SELECT * FROM surrtest Where Status != ‘X2’ or Status is null
If that doesn’t work then there’s something weird going on with your database.
In most databases, a where clause evaluates to either true, false, or unknown. Any comparison with null will result in an unknown result. Since a where clause filters out all records that don't evaluate to true, you will not see records that evaluate to unknown, as well as false.
In your original query, the where clause was filtering out null records, because they evaluated to unknown. So, you have to add the extra part or Status is null to the where clause to include the null records.
Also, do NOT use or Status = null, since that will always evaluate to unknown, like mentioned before. You must use or Status is null.

Sql with empty string, same eligibility, different results [duplicate]

This question already has answers here:
empty string in oracle
(4 answers)
Closed 1 year ago.
I've read many things around how Oracle handles null or empty string.
Let's say I have a table with these datas :
id
myfield
id1
mydata1
id2
mydata2
select * from mytable where myfield <> ' ';
select * from mytable where myfield is not null;
select * from mytable where myfield <> '' ;
When executing the first two query, I get some results. Why not with the third one ?, knowing that : it's a NOT clause, and even though my empty string was reinterpreted as null, it would make it as a is not null clause (making the 2nd and third quite the same), making it eligible ?
Oracle is weird in terms of handling nulls. It was designed, developed, and tested in the 70s, well before the SQL Standard was officially established. Oracle is a great engine but it has quirks; this is one of them.
The expression:
where myfield <> ''
gets automatically rephrased by the Oracle engine as:
where myfield <> null
And, since no value can satisfy this predicate, no rows are returned.
See example at db<>fiddle.

Replace NULL in my Table with <SOME VALUE> in PostgreSQL

Upon searching ways to replace NULL values in my table with 0 on Stack Overflow, it appears that many threads I've found point to using the COALESCE function. E.g. postgresql return 0 if returned value is null
I understand that the COALESCE function "replaces" null values for your specific query; however, the table itself remains untouched. That is, if you queried the table again in a separate query without COALESCE, null values would still exist.
My question is, is there a way for me to replace NULL values permanently in my table with a specified value (like 0) so I don't have to COALESCE in every query? And as an extension to my question, is it considered bad practice to modify the original table instead of doing manipulations in queries?
You can just do an UPDATE:
UPDATE table SET col1 = 0 WHERE col1 IS NULL;
This should effectively update all matching records on your table
I understand you got the answer but you can also use in your further query nvl function. You can replace at the runtime the NULL values with 0 just to be sure your query is working as expected.
SELECT
id
,nvl(col1, 0)
FROM
...
It's not updating in the table but you are sure that all NULL values are displayed as 0 like you want. Maybe you forget to update.

is there any difference between the queries

select field from table where field = 'value'
select field from table where field in ('value')
The reason I'm asking is that the second version allow me to use the same syntax for null values, while in the first version I need to change the condition to 'where field is null'...
When you are comparing a field to a null like field_name=NULL you are comparing to a known data type from a field say varchar to not only an unknown value but also an unknown data type as well, that is, for NULL values. When comparison like field_name=NULL again implies therefore a checking of data type for both and thus the two could not be compared even if the value of the field is actually NULL thus it will always result to false. However, using the IS NULL you are only comparing for the value itself without the implied comparison for data type thus it could result either to false or true depending on the actual value of the field.
See reference here regarding the issue of NULL in computer science and here in relation to the similarity to your question.
Now, for the IN clause (i.e. IN(NULL)) I don't know what RDBMS you are using because when I tried it with MS SQL and MySQL it results to nothing.
See MS SQL example and MySQL example.
There is no difference in your example. The second, slightly longer, query is not usually used for a single value, it is usally seen for multiple values, such as
select field from table where field in ('value1', 'value2')
yes there is difference in both this queries. In first statment you can insert only 1 value in where clause "where field = 'value'" but in second statement in where field you can insert many values using IN clause "where field in (value1,value2..)"
Examples:
1) select field from table where field ='value1';
2) select field from table where field in ('value1', 'value2')
To check null values
SELECT field
FROM tbl_name
WHERE
(field IN ('value1', 'value2', 'value3') OR field IS NULL)

What does 'null' mean when preceding a value in a SELECT statement?

Apologies if this has been asked before but I can't seem to find a relevant answer. It looks like it should be rather simple.
I'm looking at a store procedure (in Sql Server 2008) that includes a select statement similar to the following:
SELECT id, name, null revisedDate
FROM MyTable
What does 'null' mean when preceding the column 'revisedDate'? Does this mean make the returned column values null regardless? I thought it might be a way of giving it a default value of null, but then surely if there's no value then it would return null anyway.
It simply means that you are including a hardcoded NULL value in your result set. Further revisedDate is the name given to that column. For every row in the result set, this column will show NULL.
Assuming TSQL..
Im pretty sure that that will just return a column of nulls under the heading revisedDate. It wont bring back values form any column as in SQL syntax this is the equivelent of null as revisedDate
Hth
O