iT邦幫忙

1

SQL 關於 UPdate

資料表本來是NULL空值我想要UPDate 數值進去卻不能我語法有錯嗎?

 UPDATE [dbo].[TPAPQB01]
SET FctClass = 'PA'
WHERE FctClass=NULL;

https://ithelp.ithome.com.tw/upload/images/20190211/20109425VAOFgReRGp.png

他會寫0資料列受影響

看更多先前的討論...收起先前的討論...
wingkawa iT邦新手 4 級 ‧ 2019-02-11 09:23:28 檢舉
WHERE FctClass IS NULL
ted8224 iT邦新手 5 級 ‧ 2019-02-11 09:28:10 檢舉
@wingkawa 謝謝 ,是因為null 才不能用 = 嗎?
等號 於電腦中一般是用來 賦予 或 比較
null不等於任何形態值, 無法轉換與比較
因此才使用 is null 或 is not null
可能是這樣吧
stephen3342說的沒錯
sql中 若欄位為Null
必須用 is null來代表 不能用 = null
但若為空值 則是使用 = ''
還有一個可能 NULL 是字串,你要用 'NULL' 才行
如果表內真的是 NULL ( 空值 ) 要用 IS NULL ,但我看過真的有人會寫入 NULL 的字串
所以遇到這種的就要用 'NULL' 了
wingkawa iT邦新手 4 級 ‧ 2019-02-11 10:19:46 檢舉
這個 null 挺有趣的,提供參考:
https://zh.wikipedia.org/wiki/%E7%A9%BA%E5%80%BC_(SQL)
圓頭人 iT邦新手 2 級 ‧ 2019-02-11 13:13:55 檢舉
原來概念是這樣啊..它是一個狀態,不是一個值.
原來它不管和什麼比,都只會回傳NULL
謝謝大大~~

摘要如下:
SQL null是一個狀態,而不是一個值。這種用法與大多數程式語言完全不同,其中參照的空值意味著不指向任何對象。

例如,考慮「亞當擁有多少本書?」這個問題,答案可能是「零」(我們知道他沒有)或「空白」(我們不知道他擁有多少)。

由於 Null不是任何資料域的成員,因此它不被視為「值」,因此與 Null進行比較永遠不會導致 True或 False。下面表達式的邏輯結果是將值 10 與 Null進行比較,得到的結果會成為null未知:
SELECT 10 = NULL -- Results null
SELECT NULL=NULL -- Results null
5
暐翰
iT邦大師 1 級 ‧ 2019-02-11 10:13:42

錯誤原因,前面大大們都有留言了,不能使用= null來判斷。


我這邊做概念補充:
這是當初規格設計人 Codd 所特別設計,資料庫使用的是三值邏輯(true,false,unknown),而NULL指的是未知(unknown),這點很重要。

接著延伸為何不能使用 = 來判斷,因為 任何值跟未知(unknown)做判斷都是unknown
所以才需要額外 is null 判斷。

所以常會聽到前輩說:『表格欄位最好要設置not null跟預設值』,這代表的是要習慣定義值,讓資料回歸二值邏輯(true,false),這樣定義越清楚,後面維護的成本就越少。

看更多先前的回應...收起先前的回應...

但可 UPDATE [dbo].[TPAPQB01]
SET FctClass = Null

暐翰 iT邦大師 1 級 ‧ 2019-02-11 10:46:36 檢舉

fuzzylee1688,這代表設定值為未定義,當然是可以的,因為資料庫是三值邏輯: true,false,unknown(null)

呵.. 這也是初學者容易被誤導, 導致會用where FctClass = Null的地方.

暐翰 iT邦大師 1 級 ‧ 2019-02-11 10:50:57 檢舉

是的

圓頭人 iT邦新手 2 級 ‧ 2019-02-11 11:57:01 檢舉

知道怎麼用,但今天才知道三值邏輯
..長知識了...謝謝大大

暐翰 iT邦大師 1 級 ‧ 2019-02-11 12:09:46 檢舉
2
浩瀚星空
iT邦高手 1 級 ‧ 2019-02-11 13:53:19

其實,問題出在 WHERE FctClass=NULL 這個判斷式。

認真來說,資料庫的比對,也是依一筆資料的值判斷,回傳為true、false為主。
就有點像是開關的樣子解釋。

可是null值是一種很特殊的情況。
在sql命令中。如 暐翰 的說明,null它是屬於一種未知的定義。
判斷式中,並無法與未知的定義來做判斷。這還需要討論到參數類型的因素。
也就是說,你原本「WHERE FctClass=NULL」是代表FctClass的欄位值要等於null狀態。

但sql的解釋並不是這樣。它是指你的FctClass要與一個未知的定義值判斷。
因為NULL是sql內的一個常數定義值。

所以在這條的判斷式裏,就會出現永遠為flase的情況發生。自然就無法與任何資料列相符合。
所以sql語法才會有is null這樣的應用語法。

一般最好不要再資料庫內存在NULL的值會比較好。能有預設值是最好。字元欄位預設為空字串。
數值欄位則預設為0。
盡量養成良好的習慣。不要允許NULL的存在。

就不會發生你這樣的問題。

2
圓頭人
iT邦新手 2 級 ‧ 2019-02-11 14:03:07

剛看了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' -- 一輩子都不會符合

我要發表回答

立即登入回答