Oracle與MS SQL在Where And判斷上的差異

Oracle跟MS SQL在Where的And條件判斷上有一點差異,通常直覺在and判斷的時候,當第一個條件成立時,才會做第二個條件的判斷,但看來似乎不一定.

Oracle跟MS SQL在Where的And條件判斷上有一點差異,通常直覺在and判斷的時候,當第一個條件成立時,才會做第二個條件的判斷,但看來似乎不一定.

先在MS SQL與Oracle各自建立以下Schema的Table,Table名稱為UserInfo.

MS SQL

Column Name

Type

ID

Int

UserNo

Nvarchar

UserGroup

Nvarchar

Oracle

Column Name

Type

ID

Number

UserNo

Varchar2

UserGroup

Varchar2

接下來再塞以下同樣的資料到兩個DB裡.

 

ID

UserNo

UserGroup

1

1

A

2

K2

B

3

3

A

4

K6

B

接下來就在這兩個DB跑以下的Script :

select * from UserInfo where UserGroup=’A’ and cast(UserNo as int) =1

Oracle跑出來的結果是正確的,會顯示ID=1的那一筆資料,而MS SQL就出問題了,雖然ID=1的UserNo是可以轉為int,但還是出現以下錯誤訊息.

訊息245,層級16,狀態1,行1

將nvarchar 值'K2' 轉換成資料類型int 時,轉換失敗。

明明我要找的那筆的UserNo是1,可以轉換,但它還在出現錯誤.

改一下where的條件,UserGroup=’B’,這時Oracle才會出現[ ORA-01722:數字無效 ]的錯誤訊息.

所以從這個測試結果看來,Oracle在第一個條件符合後,才會再去判斷第二個條件是否符合,而MS SQL則是兩個同時做,所以才會在一開始就遇到Convert的失敗,至於那種好,見人見智,我是比較喜歡Oracle的方式,就效能來看,只要Convert符合的那幾筆跟Convert全部的資料,這就差很大~

*這樣的DB Schema設定很怪,如果要存數字,就用數字型別,為什麼要用文字,如果存文字,就不要去Cast它,但也是因為遇到這情況,才知道兩種DB在Where的and判斷下的不同.

 

==== 3/23 修改 ====

加了一個UserGroup的欄位.

在黑暗大的測試下,小弟也去測了一下,原來它發生的情況"並"不是每個都會.

用了SQL 2005 Express測了一下(版本忘了,但比9.00.3159還新),並不會發生這個狀況.

而發生這個問題的這台SQL 2005,礙於權限不足,無法做更多的測試,目前確認的是,查詢來源是一個View,結構與語法就跟上述一樣.

再找看看有沒有機會建立並重現這個問題.

 

==== 3/24 補充 ====

礙於特殊因素,所以部份內容被我劃掉,但應該不至混淆.

首先先查出所有dd='C1'的資料,可以看到符合的資料如下,sw的部份,因為註解掉了,也不會執行,可以看到sw裡面不是5就是10,全部都是數字.

1

這次把註解掉的cast拿掉,帶出sw>5的資料,從上一步可以看到,至少會回傳第二筆sw=10的.

不過竟然出現以下的錯誤訊息.

2

那看一下dd=C1,sw=高員是否有資料,結果並沒有,所以在dd='C1'內,確定sw沒有高員.

3

這個View也沒建任何Index.