每當你向資料庫發出sql查詢時……你想知道一列中是否包含null值……寫查詢將找到結果的正確方法是什麼?
你應該使用這樣的查詢嗎?
要麼!你應該使用這樣的查詢嗎?
select * from some_tablewhere some_column is null
…答案是,你應該使用第二個查詢(some_column is null)。
現在為什麼呢?
我們不在資料庫中進行其他任何比較時都不要使用「is」關鍵字,對嗎?
如果我們想知道乙個字段是否等於乙個,我們可以使用如下的where子句:
where some_column = 1
那麼為什麼我們在is關鍵字上使用 null 值呢?為什麼我們需要區別對待 null ?
答案是這樣的:在sql中,null表示「未知」的概念(因此null值表示「未知」值)。
在大多數資料庫中,null和空字串(由 "雙撇號" 或 '' 表示)之間存在差異。
但是,並非所有資料庫都這樣:例如,oracle 資料庫不允許你使用空字串。任何時候oracle資料庫看到乙個空字串,它都會自動將空字串轉換為null值。
但是,對於大多數其他資料庫,null值與空字串的處理方式不同:
這是我問以下問題的區別:「美國**西奧多·羅斯福的中間名是什麼?」
oracle 資料庫是最顯著的例外,其中這兩個值實際上都將由null表示-除 oracle 以外的大多數資料庫對 null 和空字串的處理方式都非常不同。
只要你記得 null 值代表乙個未知值,那麼這將有助於你製作sql查詢,並幫助你解決使用 null 值可能遇到的一些棘手情況。
例如,如果你要使用 where 子句這樣的查詢:
select * from some_tablewhere 1 = 1
該查詢將返回行(假設some_table不是空表!),因為表示式「 1 = 1」可證明是正確的……它可以被證明是正確的。
如果我要說:
select * from some_tablewhere 1 = 0
…然後資料庫將看到此情況,並將「 1 = 0」評估為false(這意味著該查詢將永遠不會返回任何行)。
但是如果我要說:
select * from some_tablewhere 1 = null
資料庫基本上是這樣的:「我不知道這兩個值(1和我們的黑盒null值)是否相等」……因此它不返回任何記錄。
在sql查詢中有where子句時,它可以具有三種不同結果之一:
你可能會想,「好吧,但是為什麼我要關心 false 和 null 之間的區別,因為資料庫對這兩個值的處理完全相同?」
好吧,讓我告訴你**可能遇到麻煩:讓我們介紹一下 not() 條件。
如果你要說:
select * from some_tablewhere not(1 = 1)
然後,資料庫首先要求值1 = 1,然後說:「好吧,那顯然是對的。」
但是隨後它將對其應用 not() 條件。資料庫即將執行,「好吧,當被注釋時,它變成了假……所以 not() 條件導致我們的where子句在這裡是假的。」
因此,上面的查詢不會返回任何記錄。
但是,如果你要說:
select * from some_tablewhere not(1 = 0)
然後,資料庫首先計算表示式1 = 0,並說:「那顯然是錯誤的。」
但是然後它將應用 not() 條件,這將給我們相反的結果,因此它變為true。
因此此查詢將返回記錄!
如果我發出以下查詢怎麼辦?
select * from some_tablewhere not(1 = null)
資料庫首先要評估 1 = null。(請記住,它將把null當作乙個未知值!)
它會說:「我不能說1是否等於 null,因為我不知道 null(未知)值是什麼。」
因此,它不會產生真實的結果,也不會產生錯誤的結果–而是會產生null(或未知)結果。
null 結果將由 not() 運算子解釋。
每當你使用 null 並將其置於 not() 條件時……結果就是另乙個null!(未知的反面是……嗯……另乙個未知)。
因此,not() 運算子對 null 條件不做任何事情。
所以這些查詢中的……
select * from some_tablewhere not(1 = null)
select * from some_tablewhere 1 = null
…將不返回任何記錄…即使它們是相反的!
如果我使用where子句發出這樣的查詢:
select * from some_tablewhere 1 in (1, 2, 3, 4, null)
…那麼顯然 where 子句將是正確的,由於1在我們的 in 列表中,所以該查詢將返回記錄…
但是如果我要說:
select * from some_tablewhere 1 not in (1, 2, 3, 4, null)
那麼顯然這將是錯誤的,並且該查詢將永遠不會返回記錄,因為數字1出現在我們的in列表中,並且我們說「 not in」…
現在,如果我要說這樣的話怎麼辦?
select * from some_tablewhere 5 not in (1, 2, 3, 4, null)
此 where 子句將永遠不會返回任何記錄,因為它不是真正的可證明(它不能被證明是真的)。數字5沒有明確出現在「 in」列表中,但是5可能在我們的「黑盒」 null值內(資料庫不一定知道 null 的值是什麼)。
這將產生 null 結果(表示未知結果),並且此 where 子句永遠不會返回任何記錄。
希望你現在已經準備好處理sql查詢中的null值!
神奇的 sql 之溫柔的陷阱 → 三值邏輯 與 null !
查詢字串中是否包含相同字元
題目 請實現乙個演算法,確定乙個字串的所有字元是否全都不同。這裡我們要求不允許使用額外的儲存結構。給定乙個string,inistring,請返回乙個bool值 true代表所有字元全都不同,false代表存在相同的字元。保證字串中的字元為ascii字元。字串的長度小於等於3000。測試樣例 aei...
PHP查詢字串中是否包含多個指定字串
我有乙個字串,需要檢查幾個字元。我可以用strpos 做到這一點。但是在這種情況下,我將需要多次使用strpos 像這樣的東西 if strpos str,false strpos str,false strpos str,false strpos str,false strpos str,fals...
sql字串查詢
查詢特定格式的字元 例如 查詢姓李的學生 select from student where sname like 李 如果是查詢姓李或李兩個字或三個字的名稱 select from student where left sname,1 in 李 張 andlen sname 3and len sn...