Oracle 判斷的較不嚴謹, null 與 空字串看來相同...
表格T1:
SQL> select * from t1;
USER_ID CLASS
--------- --------------------
1 A
2
3 C
語法:
SQL> update t1 set class = (case when class is null then 'NullValue' else class end);
3 rows updated.
結果:
SQL> select * from t1;
USER_ID CLASS
--------- --------------------
1 A
2 NullValue
3 C
MsSQL 與 MySQL 的用法,有分空字串與NULL
update t1 set class = (case when class='' then 'EmptyValue' else class end);
update t1 set class = (case when class is null then 'NullValue' else class end);
於Oracle 還有decode 的用法,可以達到雷同的效果,
update t1 set class = decode(class,null,'NULLVALUE',class);
於ACCESS 還有iif 的用法,可以達到雷同的效果,
Private Sub do_sql_Click()
On Error GoTo Err_do_sql_Click
Dim SQL As String
'OK: 但沒有必要多加判斷
SQL = "UPDATE [員工資料] " & _
"SET [部門代號] = iif([部門代號]='' or [部門代號] is null ,'NullValue',[部門代號]) " & _
"WHERE [工號] = '908' "
'NG: 以空字串判斷讀不到新增record的 null也讀不到修改後的空白欄位
SQL = "UPDATE [員工資料] " & _
"SET [部門代號] = iif([部門代號]='','空字串',[部門代號]) " & _
"WHERE [工號] = '908' "
'OK! 測試發現, ACCESS 不認空字串'' 型態,用null即可包含空字串.
SQL = "UPDATE [員工資料] " & _
"SET [部門代號] = iif([部門代號] is null,'nullvalue',[部門代號]) " & _
"WHERE [工號] = '907' "
DoCmd.RunSQL SQL
MsgBox (SQL)
Exit_do_sql_Click:
Exit Sub
Err_do_sql_Click:
MsgBox Err.Description
Resume Exit_do_sql_Click
End Sub
補充:
於 MsSQL 必須留意, 空字串''與 NULL 是不同的!
空字串於 CASE WHEN 可以用 CLASS = '' 表示比較條件式,
NULL 於 CASE WHEN 應該用 CLASS IS NULL 表示條件式, 或利用 ISNULL(CLASS,'NULLVALUE')轉換之.
PS: 其他資料庫尚未實測.
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。