亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

非IN子句和空值

非IN子句和空值

德瑪西亞99 2019-06-06 15:55:13
非IN子句和空值這個問題出現時,我得到了不同的記錄計數,我認為是相同的查詢之一使用not in where約束和另一個約束left join..的桌子not in約束有一個空值(壞數據),這將導致該查詢返回0條記錄的計數。我有點理解為什么,但是我需要一些幫助來充分理解這個概念。簡單地說,為什么查詢A返回一個結果而B不返回?A: select 'true' where 3 in (1, 2, 3, null)B: select 'true' where 3 not in (1, 2, null)這發生在SQLServer 2005上。我還發現set ansi_nulls off使B返回結果。
查看完整描述

3 回答

?
青春有我

TA貢獻1784條經驗 獲得超8個贊

查詢A與以下內容相同:

select 'true' where 3 = 1 or 3 = 2 or 3 = 3 or 3 = null

3 = 3是真的,你得到了結果。

查詢B與以下內容相同:

select 'true' where 3 <> 1 and 3 <> 2 and 3 <> null

什么時候ansi_nulls開著呢,3 <> null是未知的,因此謂詞的計算結果是未知的,因此不會得到任何行。

什么時候ansi_nulls離開了,3 <> null為true,因此謂詞的計算結果為true,然后得到一行。


查看完整回答
反對 回復 2019-06-06
?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

每當您使用NULL時,您實際上是在處理一個三值邏輯。

當WHERE子句的計算結果為:

    3 = 1 or 3 = 2 or 3 = 3 or 3 = nullwhich is:
    FALSE or FALSE or TRUE or UNKNOWN
which evaluates to 
    TRUE

第二項:

    3 <> 1 and 3 <> 2 and 3 <> nullwhich evaluates to:
    TRUE and TRUE and UNKNOWN
which evaluates to:
    UNKNOWN

未知與false不同,您可以通過調用以下命令輕松地對其進行測試:

select 'true' where 3 <> nullselect 'true' where not (3 <> null)

這兩個查詢都不會給出結果。

如果未知與false相同,那么假設第一個查詢會給出false,那么第二個查詢將不得不計算為true,因為它將與NOT(False)相同。
情況并非如此。

有一個很好的關于SqlServerCentral的文章.

一開始,關于NULL和三值邏輯的整個問題可能有點混亂,但要想在tsql中編寫正確的查詢,就必須要理解這些問題。

我推薦的另一篇文章是SQL聚合函數和NULL.


查看完整回答
反對 回復 2019-06-06
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

NOT IN當與未知值比較時,返回0條記錄。

NULL是未知的,NOT IN查詢包含NULLNULL在可能的值列表中,s將始終返回。0記錄,因為無法確定NULL值不是正在測試的值。


查看完整回答
反對 回復 2019-06-06
  • 3 回答
  • 0 關注
  • 488 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號