關於一個"恆真(恆假)條件"與"NULL參與比較判斷"共同作用引發的語句結果異常
看標題,自己也覺得有些拗口.
主要是兩方面:
(1)恆真(恆假)條件:
不少開發人員,為了拼接語句的便利,採用恆真(比如1=1)條件為基礎,拼接若干個and條件,這樣就可以不做判斷條件之前應該是where還是and,同樣道理,採用恆假(比如1<>1)條件為稽查,拼接若干個or條件,這樣就可以不做判斷條件前面應該是where還是or.
這種做法,在邏輯上是正確的.但有時候也會有問題.
(2)NULL參與比較判斷
大家知道,如果需要判斷是否為NULL,不能用=和<>,而是需要用is NULL或者is not NULL,或者用IsNULL函式將NULL轉換為一個非NULL的值之後再進行比較.如果用=或者<>,出現的情況極有可能與預想的不同.
下面這個例子(偽SQL語句,可惜精確的語句當時並未儲存),是兩個因素一起出現在一個語句中的異常現象.
select ...
from A,B,C
where A.f1=*B.f1
and ...
and ( (substr(A.f2,1,4)='abcd' and {此處省略幾個結果為true的關聯條件})
or 1<>1
)
場景是substr(A.f2,1,4)實際值是NULL.
如果去掉or 1<>1,則能查詢出結果,如果加上or 1<>1,就不能查詢出結果了.
對這個奇怪的現象,通過檢視執行計劃簡單分析了一下,去掉or 1<>1的情況下,經過了三次巢狀迴圈連線之後出現一次filter,而加上or 1<>1,經過了兩次巢狀迴圈連線,就出現filter,而另一次巢狀迴圈,是發生在filter之後.
總之,恆真(恆假)條件的有無,使執行計劃有所不同,而執行計劃的不同,又影響了語句的結果.
啟示:謹慎使用1=1或1<>1這種恆真恆假條件,謹慎對待NULL參與比較判斷.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29512902/viewspace-1254885/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- makefile--if條件判斷語句的語法與使用
- 條件判斷語句 if case
- Go的條件判斷語句的使用Go
- python中if條件語句對於布林值和非布林值的判斷結果Python
- C++ 條件與 If 語句:掌握邏輯判斷與流程控制精髓C++
- 前端筆記之JavaScript(三)關於條件判斷語句、迴圈語句那點事前端筆記JavaScript
- MySQL條件判斷IF,CASE,IFNULL語句詳解MySqlNull
- Python中if條件判斷語句怎麼用?Python
- python基礎之如何用if語句判斷多個條件?Python
- 前端筆記之JavaScript(二)關於運算子&初識條件判斷語句前端筆記JavaScript
- python條件判斷與迴圈Python
- Java中的條件判斷語句-動力節點Java
- 最簡潔的python條件判斷語句寫法Python
- 『忘了再學』Shell流程控制 — 33、if條件判斷語句(一)
- python兩種簡潔的條件判斷語句寫法Python
- Python條件語句與迴圈Python
- WordPress開發入門06:條件判斷與迴圈
- 『忘了再學』Shell流程控制 — 34、if條件判斷語句(二)
- PHP7 ?? 與 ?: 的作用和區別(null合併運算子, null條件運算子)PHPNull
- C語言中迴圈語句while 中判斷條件出現 || 和 && 的區別C語言While
- AWK if(條件)語句與迴圈簡介
- 判斷語句
- JS中判斷null、undefined與NaN的方法JSNullUndefinedNaN
- 關於情色與 MOD 的永恆爭議:第 34 條法則就是真理嗎?
- JS的判斷語句:判斷、迴圈JS
- 使用帶型別判斷的比較判斷型別
- 寫給.NET開發者的Python教程(三):運算子、條件判斷和迴圈語句Python
- 判斷語句的使用
- 條件語句
- C 判斷語句
- 012 判斷語句
- day31-33 關於點選事件內的判斷語句事件
- Grovvy-條件判斷
- 六、Vue條件判斷Vue
- 兩集合比較判斷
- 一個UPDATE語句引發的血案
- Java 數學運算與條件語句全解析Java
- 拼多多清倉活動真的假的?參與條件是什麼?
- Linux判斷上一個語句是否執行成功Linux