IN Clause with NULL or IS NULL
An
in
statement will be parsed identically tofield=val1 or field=val2 or field=val3
. Putting a null in there will boil down tofield=null
which won't work.
(Comment by Marc B)
I would do this for clairity
SELECT *
FROM tbl_name
WHERE
(id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)
Not equal != operator on NULL
<>
is Standard SQL-92; !=
is its equivalent. Both evaluate for values, which NULL
is not -- NULL
is a placeholder to say there is the absence of a value.
Which is why you can only use IS NULL
/IS NOT NULL
as predicates for such situations.
This behavior is not specific to SQL Server. All standards-compliant SQL dialects work the same way.
Note: To compare if your value is not null, you use IS NOT NULL
, while to compare with not null value, you use <> 'YOUR_VALUE'
. I can't say if my value equals or not equals to NULL, but I can say if my value is NULL or NOT NULL. I can compare if my value is something other than NULL.
SQL is null and = null
In SQL, a comparison between a null
value and any other value (including another null
) using a comparison operator (eg =
, !=
, <
, etc) will result in a null
, which is considered as false
for the purposes of a where clause (strictly speaking, it's "not true", rather than "false", but the effect is the same).
The reasoning is that a null
means "unknown", so the result of any comparison to a null
is also "unknown". So you'll get no hit on rows by coding where my_column = null
.
SQL provides the special syntax for testing if a column is null
, via is null
and is not null
, which is a special condition to test for a null
(or not a null
).
Here's some SQL showing a variety of conditions and and their effect as per above.
create table t (x int, y int);
insert into t values (null, null), (null, 1), (1, 1);
select 'x = null' as test , x, y from t where x = null
union all
select 'x != null', x, y from t where x != null
union all
select 'not (x = null)', x, y from t where not (x = null)
union all
select 'x = y', x, y from t where x = y
union all
select 'not (x = y)', x, y from t where not (x = y);
returns only 1 row (as expected):
TEST X Y
x = y 1 1
See this running on SQLFiddle
What is the Null Column in Describe statement?
USER_TAB_COLUMNS.NULLABLE contains 'N' if a column is not allowed to be set to NULL, and 'Y' if the column may be set to NULL. If you want to model the behavior of DESCRIBE it looks like your statement should be something like:
select column_name as Name,
CASE nullable WHEN 'N' THEN 'NotNull' WHEN 'Y' THEN NULL END AS NULLABLE,
data_type || '(' || data_length || ')' as TYPE
from user_tab_columns
where table_name='EMP'
Share and enjoy.
NULL values in SQL server query
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.
Why rows with NULL in column used in WHERE clause are omitted in results?
Is that bug in SQL server or I don't know something
Well, it's not a bug.
Think of NULL
as a placeholder for "Unknown" and it will be clearer.
If I ask you to find me all the rows where the value is not 2
then you cannot return any NULL (unknown) value since you do not know that it is NOT 2.
If you want to include NULLs then the criteria should be
where value != 2 or value is null;
Null Value Statement
In a CREATE TABLE, the NULL or NOT NULL here varchar(50) null
is a constraint that determines whether NULLs are allowed. NOT NULL means no.
When you inserted data, which statement did you run?
INSERT TABLE1 VALUES (Null, 1, First, Null)
or
INSERT TABLE1 VALUES ('Null', 1, First, 'Null')
- The first one uses the keyword NULL, inserts a NULL (not a null value: no such thing, arguably). No values is stored except in the NULL bitmap fields
- The second one has a string "null" and the characters N, U, L, L + 2 bytes for length are stored
When you run SELECT * FROM TABLE1
, client tools will show NULL.
To test whether you actually have NULLs or the string NULL, run this
SELECT ISNULL(name, 'fish'), ISNULL(date, GETDATE()) FROM TABLE1
For the SELECTs
--null symbols. No value stored
SELECT * FROM TABLE1 WHERE NAME IS NULL
--string null
SELECT * FROM TABLE1 WHERE NAME = 'NULL'
--empty string
SELECT * FROM TABLE1 WHERE NAME = ' '
Note: null symbol/value is not empty string. It has no value and won't compare. Even to itself.
As for your DBA, the code above with ISNULL will decide what is stored.
Edit: if you are storing null symbol/value, then your DBA should read up on "null bitmap"
Related Topics
How to Find Which Columns Don't Have Any Data (All Values Are Null)
SQL Server: Only Last Entry in Group By
How to Convert SQL to Relational Algebra in Case of SQL Joins
How to Call a User Defined Function to Use with Select, Group By, Order By
Escaping Strings Containing Single Quotes in Powershell Ready for SQL Query
How to Use a Returned Column Value as a Table Name in an SQLite Query
Ssis Hidden Sheets as Excel Destination
SQL Server: Order by Parameters in In Statement
Postgresql - Replace HTML Entities
Converting Aggregate Operators from SQL to Relational Algebra
SQL Varchar(Max) VS Varchar(Fix)
Ms Access: How to Count Distinct Value Using Access Query
Like Operation Returns No Rows on Nvarchar Column Filter If the Column Data Start with Numeric