Sql identical query but showing different Result - sql

I have written a query in Sql server 2008.
select select * from program
where program_description <> null
But,Result of above query is blank.
whereas the below query is showing me the desired result.
select * from program
where program_description is not null
Is there any difference between them...?

Yes, = and <> do not work with null.
You have to use IS NULL or IS NOT NULL

Yes there is a difference. Comparing something with null will always result in unknown.
That is why you need to compare null results with is null

yes, the difference is -- according to standard, all operation with null return null. Including <>. The only valid way to check null value is operation 'is null'.

Related

Substitute FROM ISNULL in where clause in ms sql server

We used Stored Procedure on our Queries. Some of our field got NULL value, so for us to get this value we Put the conversion of ISNULL inside the WHERE condition but per checking it affects the Process of our strodproc based on the SQL performance tool.
Ex.
SELECT * FROM tblInfo
WHERE ISNULL(fldInfo,'') <> ''
tblInfo
fldinfo
NULL
30
NULL
20
Query
SELECT * FROM tblinfo WHERE fldinfo NOT IN (30,20) - different result
SELECT * FROM tblinfo WHERE ISNULL(fldinfo,'') NOT IN (30,20) - Correct
Result
Any other Substitute process of script we can use so that we can get the value but not affecting the performance of the query.
Your approach will be non sargable. Even though you have an index it will not be used.
Right way to do this would be using IS NOT NULL condition
SELECT * FROM tblInfo
WHERE fldInfo <> ''
AND fldInfo IS NOT NULL
If you don't have a index, then create a index on fldinfo to improve the performance
Update :
Not In fails to compare the NULL values. Comparison with NULL values are unknown so it is fails to return the NULL values. Here is the correct way to do this
SELECT *
FROM tblInfo
WHERE (fldinfo NOT IN ( 30, 20 ) OR fldinfo IS NULL)
COALESCE is one option that you can try. It behaves in the same way. However the differences between performance has to be evaluated by you with some test
Some differences between ISNULL and COALESCE are outlined here:
SQL - Difference between COALESCE and ISNULL?
EDIT: Based on the tests done by multiple people and by theory, ISNULL seems to be a better option over COALESCE
Which is quicker COALESCE OR ISNULL?
No need for IIF. Simply check for NULL
WHERE fldinfo IS NOT NULL
Or, of course, use IS NULL if you want rows where this condition is met

Why oracle DB does not update the fileds

I do not know what is wrong with this query but it does not give any error and does not update the row. ENDDATETIME field datatype is TIMESTAMP.
UPDATE TEST_BANK set STATUS = 'RECEIVED', ENDDATETIME = '16-JUN-15 11.21.06.000000000' WHERE ENDDATETIME = null ;
I believe in Oracle the syntax for checking for null is as following
WHERE ENDDATETIME IS NULL
instead of the
WHERE ENDDATETIME = NULL
You can try this
UPDATE TEST_BANK set STATUS = 'RECEIVED', ENDDATETIME = '16-JUN-15 11.21.06.000' WHERE ENDDATETIME is null ;
Your ENDDATETIME format is wrong, hence its not selected.
Just copy paste the column value, and paste it in where clause ..it will work
Are you able to get the result
Select * from TEST_BANK WHERE ENDDATETIME = null ;
Use IS NULL instead of = null
You can't compare NULL values. You'll need the "IS" operator.
UPDATE TEST_BANK
SET STATUS = 'RECEIVED',
ENDDATETIME = '16-JUN-15 11.21.06.000000000'
WHERE ENDDATETIME IS NULL ;
To explain this:
Assume Mr. Little and Mr. Large. You don't know how tall they are (size is null). Now can you positively state that they are of the same size?
If not, they won't be "selected" when compared.
Hence you need a comparion function to test if the value is unknown, which is what the "IS NULL" does.
Operator is always applied on data while NULL is predicate in oracle. So it won't be worked with operator.
When ever you want to deal with NULL always use IS NULL or IS NOT NULL.
Nulls with Comparison Conditions
To test for nulls, use only the comparison conditions IS NULL and IS NOT NULL. If you use any other condition with nulls and the result depends on the value of the null, then the result is UNKNOWN. Because null represents a lack of data, a null cannot be equal or unequal to any value or to another null. However, Oracle considers two nulls to be equal when evaluating a DECODE function. Please refer to DECODE for syntax and additional information.
Oracle also considers two nulls to be equal if they appear in compound keys. That is, Oracle considers identical two compound keys containing nulls if all the non-null components of the keys are equal.

Selecting rows which are not null in sql

Why doesn't the following code work in SQL
SELECT *
FROM DATA
WHERE VALUE != NULL;
we can not Compare null value with = We Special operator to compare null
value in sql
IS OPERATOR
SELECT *
FROM DATA
WHERE VALUE is not NULL;
Null is not any Value.Sql consider Null as Unknown/absence of data.
The condition you written is not in proper format.
If you want to select not null values from your table then you can use the following command
select *from table name where column name IS NOT NULL
If should work if you replace "!=" with "IS NOT".
Because a NULL value indicates an absence of data, it doesn't make sense to compare something with a value to it with an equals operator.
You can make your SELECT statement work by setting ANSI_NULLS OFF
SET ANSI_NULLS OFF
before running the statement. You can get further information here:
https://msdn.microsoft.com/en-us/library/ms188048.aspx
Null does not contain any value. Null is neither zero nor any value.
So we can't compare it using comparision operators.
Instead of using '=', you should use 'IS' keyword.
SELECT * FROM DATA WHERE VALUE IS NOT NULL;
The code will not work in SQL because it is not possible to test for NULL values with the following operators =, <, or <>. It is not possible to compare NULL and 0 as they are not equivalent.
You can test for NULL values using the IS NULL and IS NOT NULL operators instead.
SELECT *
FROM DATA
WHERE VALUE IS NOT NULL
http://www.w3schools.com/sql/sql_null_values.asp

Why does check against existing data not cover NULL in SQL Server 2008

This might be the situation in other databases as well but when you make the following query
SELECT * FROM MyTbl WHERE MyColumn != 'Foo'
then any record where MyColumn is, say, 'Bar' is fetched but not where MyColumn is NULL. I assume this is expected behavior and that there is a reason behind it and I'd like to know why.
Is NULL considered to be equal to 'Foo' or is it just not expected to be part of the condition because the condition (NULL != 'Foo') seems to be true.
In DB logic, NULL means that there is simply no defined data in this field. It's considered neither equal or different to anything. You have to filter on it explicitly if you want to fetch the relevant lines :
SELECT * FROM MyTbl WHERE MyColumn != 'Foo' OR MyColumn IS NULL
See Wikipedia.
In SQL Server works three-state logic, which mean that NULL = NULL UNKNOWN which treats as FALSE
In all relational databases, the null value is not equal to anything, including itself.
You would not be able to find the rows with null values for MyColumn even if your query was "select * from MyTbl where MyColumn = null". The only way to get them would be "select * from MyTble where MyColumn is null"
For a detailed explanation, see http://en.wikipedia.org/wiki/Null_(SQL)
Yep, as Tim commented, NULL values are unknown. SQL Server isn't going to make an assumption about a NULL value in order to make a match. You can check out more info about how SQL Server processes NULLs.

NULL values in SQL server query

I've a Status column in a table which has 3 values - 'N/A' , 'Single' ,'Multiple'. Some rows have a NULL value for the Status column.
I need to pull up all the rows in which Status is not null and is not 'N/A'. Basically, I need all the rows whose status is "Single" or "Multiple".
I've been just reading up about NULL actually being equivalent to 'UNKNOWN'.
If I say
SELECT *
FROM t_userstatus
WHERE status <> 'N/A'
I get the results (All rows containing "Single" or "Multiple" only).
What I would like to know is that , does the above WHERE clause always exclude the rows having NULL values?Is that the expected behaviour?
What causes this to exclude null rows even though I've not explicitly specified it?
In my query,do I have to explicitly say status IS NOT NULL ?
I am relatively new to programming, any help is appreciated.
It is not normal behavior as N/A (Single & Multiple as well) is a string that is not related to NULL. Even though the NULL is evaluated to unknown and may not return, you should explicitly use IS NOT NULL.
SELECT [column_list] FROM t_userstatus
WHERE status IS NOT NULL AND status <> 'N/A'
I would also recommend you get in the habit of specifying a column list.
SQL uses three-valued logic: true, false, and unknown. Any comparison to null results in unknown.
So null <> 'N/A' evaluates to unknown. Since unknown is not true, that means the row gets excluded.
Yes, that is the normal behavior. A NULL value has no value, so it does not satisfy a WHERE condition. If you want to also include null values, you need to specify IS NOT NULL as well.
As others have said, null is generally not comparable. So, a status != 'N/A' comes back as false when status is null.
But what others haven't mentioned yet is that that is controlled through the Ansi_nulls setting. By default it is on and nulls are not comparable (as you state in the question, the principal behind this is that they are unknown so it is false that they are not necessarily N/A). But you can use
SET ANSI_NULLS OFF
To change this behavior in which case a null will be equal to a null and not equal to anything else. There is more details on MSDN here.
A bit non-obviously, SQL has three valued logic (true/false/unknown). Any direct comparison with NULL will result in the value unknown which in the WHERE clause is considered non-true. Your condition;
WHERE status <> 'N/A'
will in other words never match a null since NULL is never "not equal" to anything.
The only ways to match a NULL using a comparison is using the special null operations IS NULL or IS NOT NULL.
As a side note, life is naturally never quite that simple.