2010-11-11 110 views
1

我目前在撥打O'Reilly's Learning SQL。鑑於以下查詢,它返回21行:SQL OR操作員

select account_id, product_cd, cust_id, avail_balance 
from account 
where 
product_cd = 'CHK' OR 
product_cd = 'SAV' OR 
product_cd = 'CD' OR 
product_cd = 'MM' 

正在使用的BPF我想這一點,它返回24行和96個警告。

select account_id, product_cd, cust_id, avail_balance 
from account 
where product_cd = ('CHK' OR 'SAV' OR 'CD' OR 'MM'); 

我知道,一個可以使用IN運營商,但是,爲什麼第二 查詢返回3個行?

+2

你在使用什麼SQL數據庫?這個語法在其中一些上是無效的。 – Oded 2010-11-11 15:12:20

+0

建議堅持使用ANSI標準'IN'。 – 2010-11-11 15:16:10

+0

很晦澀的問題。我以爲我不知道關於SQL的一些東西。下次你寫這樣一個問題,至少寫出什麼是輸出,而不是它的大小。 – AlexanderMP 2010-11-11 15:17:47

回答

1

我猜測存在一些隱式轉換,並且('CHK' OR 'SAV' OR 'CD' OR 'MM')正在評估爲布爾值。這似乎SQL服務器,例如在不合法的,我不能這樣做:

select ('CHK' OR 'SAV' OR 'CD' OR 'MM') 
1

如果這是MySQL的,我想你會發現你的第二個查詢返回結果equivilent來「其中product_cd = 1」,這只是所以碰巧還有3行然後第一個查詢,第二個查詢不正確

0

如果你正在學習SQL,即ANSI SQL,你應該設置MySQL使用ANSI confomance,或者使用一個真正符合ANSI的產品,捕獲你的錯誤,並不返回假結果。下面的表達式爲:

('CHK' OR 'SAV' OR 'CD' OR 'MM') 

是SQL中的普通錯誤,因爲OR只能與布爾值一起使用,例如比較結果。

MySQL正在將字符串「轉換」爲整數等,然後將表達式的結果與product_cd進行比較。查詢的結果是無用的。