摘要:MSSQL的NULL比較
/*NULL*/
NULL 值表示資料行的資料值為未知或無效的。NULL 並不是"0"、"零長度字串"或"空白字元值"
--1'以titan的例子再延伸
select remark from A; --三筆資料 a,b,c
select remark from B; --三筆資料(含一筆null) a,b,null
--正確顯示含a,b的兩筆資料
select * from A where remark in ('a','b',null)
select * from B where remark in (SELECT REMARK FROM B)
--應顯示C這筆但竟無資料
select * from A where remark NOT IN ('a','b',null)
select * from B where remark NOT IN (SELECT REMARK FROM B)
此時輸入指令SET ANSI_NULLS OFF(預設為on,這選項只在其設定所在之SESSION內有效,而不會更改到資料庫的屬性選項。),就可正確顯示結果
--2、NULL被用來比較時
SET ANSI_NULLS ON
SELECT 'YES' WHERE 1<>null
SELECT 'YES' WHERE null=null
SELECT 'YES' WHERE null is null
只有最後一個為true
--
SET ANSI_NULLS OFF
SELECT 'YES' WHERE 1<>null
SELECT 'YES' WHERE null=null
SELECT 'YES' WHERE null is null
三個都為true
PS:從結果中可以知道在含有Null 值的比較中,使用IS NULL 和IS NOT NULL比較好,因它不受ANSI_NULLS 的設定影嚮另外未來SQLSERVER可能不支援設定ANSI_NULLS。
----3、NULL的運算
--數值與NULL值計算時會產生NULL(未知數)
SELECT 1+NULL
SELECT 1-NULL
SELECT 1*NULL
SELECT 1/NULL
PS:若欄位的資料有null時匯總函數(EX:COUNT()、SUM()、AVG()、MAX()、MIN()等~~)計算時會”略過”NULL的資料
--但串連字串時則不一定,這牽涉到concat_NULL_yields_null 的設定(在該SESSION內有效,而不會更改到資料庫的屬性選項)
--concat_NULL_yields_null:ON 時(預設值) 字串+null回傳null
SET concat_NULL_yields_null ON
DECLARE @i VARCHAR(10)
SELECT 'abc'+@i --null
--concat_NULL_yields_null:OFF時字串+NULL回傳該"字串"
SET concat_NULL_yields_null off
DECLARE @i VARCHAR(10)
SELECT 'abc'+@i --abc
PS: 'null' 不等於null
INSERT into A values(1,'null') --輸入'null'的字串值
INSERT into A values(1,null) --輸入null(未知值)