今天有一條sql需要某兩個字段不能為空,當然是不能為null也不能為空字符串啦。
然后就開始寫
1 WHERE
2 ( 3 order_amount != null
4 and order_amount != ''
5 and received_amount != null
6 and received_amount != ''
7 )
查詢結果,一條也沒有!
網上搜索才發現:
在SQL中邏輯表達式的可能值包括TRUE、FALSE和UNKNOWN,它們被稱之為三值邏輯。
在其它的語言中,邏輯表達式只有兩種,要么是true,要么就是false。而sql中卻存在第三個邏輯表達式UnKnown,這個是sql中特有的。從字面意思上我們可以解理該值的意思是:什么都不知道,就是什么都不是。一般情況下我們將任何值(包括NULL本身)與NULL做比較的時候,都會返回UnKnown。而在查詢表達式中(比如where與having中),UnKnown會視為false。所以我們就明白了為什么select * from 表 where 字段=null查不到正確的結果的原因了。
但並不是在所有場情下UnKnown都會視為false來處理,在check約束中,UnKnown就會視為true來處理。這就是為什么我們設置某個字段的值必須大於等於0的情況下,我們還可以往該字段中插入Null值,那是因為在check約束中null>=0的邏輯結果UnKnown會被當作true來處理。
所以判斷null值請用 is not
1 WHERE
2 ( 3 order_amount is not null
4 and order_amount != ''
5 and received_amount is not null
6 and received_amount != ''
7 )
sql竟然還有這么個規則,不同語言之間的差距也太大了,每種語言都有自己個性化的東西。為什么程序員難做,因為每種語言都不同,而做一個項目往往要用到幾種語言,而且語言也在發展。希望日后能有一種語言適用於所有場景:數據庫、后台、前端......