MSSQL_NULL的比較

  • 4067
  • 0
  • 2012-02-09

摘要: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內有效,而不會更改到資料庫的屬性選項。),就可正確顯示結果

 

--2NULL被用來比較時

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

 

----3NULL的運算

--數值與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(未知值)