資料表本來是NULL空值我想要UPDate 數值進去卻不能我語法有錯嗎?
UPDATE [dbo].[TPAPQB01]
SET FctClass = 'PA'
WHERE FctClass=NULL;
他會寫0資料列受影響
錯誤原因,前面大大們都有留言了,不能使用= null
來判斷。
我這邊做概念補充:
這是當初規格設計人 Codd 所特別設計,資料庫使用的是三值邏輯
(true,false,unknown),而NULL指的是未知(unknown)
,這點很重要。
接著延伸為何不能使用 = 來判斷
,因為 任何值跟未知(unknown)做判斷都是unknown
所以才需要額外 is null 判斷。
所以常會聽到前輩說:『表格欄位最好要設置not null跟預設值』,這代表的是要習慣定義值
,讓資料回歸二值邏輯(true,false),這樣定義越清楚,後面維護的成本就越少。
但可 UPDATE [dbo].[TPAPQB01]
SET FctClass = Null
fuzzylee1688,這代表設定值為未定義,當然是可以的,因為資料庫是三值邏輯: true,false,unknown(null)
呵.. 這也是初學者容易被誤導, 導致會用where FctClass = Null的地方.
其實,問題出在 WHERE FctClass=NULL 這個判斷式。
認真來說,資料庫的比對,也是依一筆資料的值判斷,回傳為true、false為主。
就有點像是開關的樣子解釋。
可是null值是一種很特殊的情況。
在sql命令中。如 暐翰 的說明,null它是屬於一種未知的定義。
判斷式中,並無法與未知的定義來做判斷。這還需要討論到參數類型的因素。
也就是說,你原本「WHERE FctClass=NULL」是代表FctClass的欄位值要等於null狀態。
但sql的解釋並不是這樣。它是指你的FctClass要與一個未知的定義值判斷。
因為NULL是sql內的一個常數定義值。
所以在這條的判斷式裏,就會出現永遠為flase的情況發生。自然就無法與任何資料列相符合。
所以sql語法才會有is null這樣的應用語法。
一般最好不要再資料庫內存在NULL的值會比較好。能有預設值是最好。字元欄位預設為空字串。
數值欄位則預設為0。
盡量養成良好的習慣。不要允許NULL的存在。
就不會發生你這樣的問題。
剛看了wingkawa大大提供的文章
https://zh.wikipedia.org/wiki/%E7%A9%BA%E5%80%BC_(SQL)
概念是這樣啊..它是一個狀態,不是一個值.
原來NULL不管和什麼比,都只會回傳狀態NULL,而不是TRUE和FALSE
xxx=NULL,所以不管是IF xxx=NULL或是WHEN xxx=NULL 都是回傳狀態NULL
SELECT 10 = NULL -- Results null
SELECT NULL=NULL -- Results null
case when xxx=NULL then 'i am null' -- 一輩子都不會符合
case xxx when NULL then 'i am null' -- 一輩子都不會符合
所以它要用xxx is null
摘要如下:
SQL null是一個狀態,而不是一個值。這種用法與大多數程式語言完全不同,其中參照的空值意味著不指向任何對象。
例如,考慮「亞當擁有多少本書?」這個問題,答案可能是「零」(我們知道他沒有)或「空白」(我們不知道他擁有多少)。
由於 Null不是任何資料域的成員,因此它不被視為「值」,因此與 Null進行比較永遠不會導致 True或 False。下面表達式的邏輯結果是將值 10 與 Null進行比較,得到的結果會成為null未知:
SELECT 10 = NULL -- Results null
SELECT NULL=NULL -- Results null
case when xxx=NULL then 'i am null' -- 一輩子都不會符合
case xxx when NULL then 'i am null' -- 一輩子都不會符合