select sex, id from qualification where cid = ('Male' or 'Female')
对比
select sex, id from qualification where cid = 'Male' or cid = 'Female'
第一个代码将生成所有的项目,而第二个给我想要的。从某种意义上说,我们不能在括号中有或有sql?
wrrgggsh1#
为了方便起见,MySQL通常会将一个值cast转换为另一个类型。例如,将字符串转换为数字。MySQL可以根据字符串的前导数字将字符串转换为数字,例如:
cast
select cast('test' as signed); //returns 0 select cast('1test' as signed); //returns 1
正如Gelu所指出的,这一点之前已经在另一个QA上讨论过。另一方面,true表示为1,而false表示为0。现在,让我们检查一下您的查询:
true
1
false
0
让我们逐位解析where子句。
where
cid = ('Male' or 'Female')
or运算符接受两个boolean操作数。在您的情况下,这两个操作数将是'Male'和'Female'。根据MySQL处理转换的方式,如果'Male'和'Female'没有前导数字,它们将返回0。
or
boolean
'Male'
'Female'
cid = (0 or 0)
or的两个操作数的值都为false,结果为false。解析('Male' or 'Female')后,where子句将为:
('Male' or 'Female')
cid = 0
假设cid列包含的字符串没有任何前导数字,我们可以Assert所有cid都被转换为0。这将导致您的查询被重写为:
cid
select sex, id from qualification where 0 = 0
也就是说:
select sex, id from qualification where true
上面的查询将返回所有行。
编辑:对答案进行了重大调整。我觉得之前的答案可能有点混乱。
1条答案
按热度按时间wrrgggsh1#
为了方便起见,MySQL通常会将一个值
cast
转换为另一个类型。例如,将字符串转换为数字。MySQL可以根据字符串的前导数字将字符串转换为数字,例如:
正如Gelu所指出的,这一点之前已经在另一个QA上讨论过。
另一方面,
true
表示为1
,而false
表示为0
。现在,让我们检查一下您的查询:
让我们逐位解析
where
子句。or
运算符接受两个boolean
操作数。在您的情况下,这两个操作数将是'Male'
和'Female'
。根据MySQL处理转换的方式,如果'Male'
和'Female'
没有前导数字,它们将返回0。or
的两个操作数的值都为false
,结果为false
。解析('Male' or 'Female')
后,where
子句将为:假设
cid
列包含的字符串没有任何前导数字,我们可以Assert所有cid
都被转换为0
。这将导致您的查询被重写为:也就是说:
上面的查询将返回所有行。
编辑:对答案进行了重大调整。我觉得之前的答案可能有点混乱。