select sex, id from qualification where cid = ('Male' or 'Female')
和
select sex, id from qualification where cid = 'Male' or cid = 'Female'
第一个代码生成所有的项目,而第二个代码给出我想要的。
从某种意义上说,我们不能在sql?MySQL通常将cast
值转换为另一种类型,以方便我们。其中一个例子是将字符串强制转换为number。
MySQL可以根据字符串的前导数将字符串转换为数字。例如:
select cast('test' as signed); //returns 0
select cast('1test' as signed); //returns 1
正如Gelu指出的,这在之前的另一个QA中已经讨论过了。
另一方面,true
表示为1
,false
表示为0
。
现在让我们检查您的查询:
select sex, id from qualification where cid = ('Male' or 'Female')
让我们逐位解析where
子句。
cid = ('Male' or 'Female')
or
操作符接受两个boolean
操作数。在你的情况下,是'Male'
和'Female'
。根据MySQL处理类型转换的方式,'Male'
和'Female'
都将返回0,因为它们根本没有前导数。
cid = (0 or 0)
两个操作数都为false
的or
将得到false
。在解析('Male' or 'Female')
之后,where
子句将是:
cid = 0
假设cid
列包含没有任何前导数字的字符串,我们可以断言所有cid
都被转换为0
。这将导致您的查询被重写为:
select sex, id from qualification where 0 = 0
这也意味着:
select sex, id from qualification where true
上面的查询将返回所有行。
编辑:答案是重大重组。我觉得前面的答案可能有点令人困惑。