2010-11-11 111 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进行比较。查询的结果是无用的。