在MySql中,如果IF()函数的第一个参数是一个字符串,为什么它返回false?
SELECT IF('string', 'string', 'not string'); -- 'not string'
当然,如果我做了
,我可以解决这个问题IF(!ISNULL('string'), 'string', 'not string')) -- 'string'
或
IFNULL('string', 'not string'); -- 'string'
它似乎有点违反直觉,它以一种字符串的形式评估字符串
SELECT IF(1, 'one', 'not one'); -- 'one'
和
SELECT IF('1', 'one', 'not one'); -- 'one'
评估他们的行为......
答案 0 :(得分:6)
来自MySQL
如果(表达式1,表达式2,表达式3)
如果expr1为TRUE(expr1<> 0且expr1<> NULL),则IF()返回 表达式2;否则返回expr3。 IF()返回一个数字或字符串 价值,取决于上下文 使用它。
因此1是真的,因为1!= 0和1!= NULL。这就像你在C中看到的那样。
但是对于一个字符串,说'test'评估为true在定义中没有真正的基础,并且没有逻辑意义。它需要与布尔结果的某些东西进行比较。
答案 1 :(得分:5)
The first argument given to IF()
is a predicate。 MySQL不会将字符串视为谓词,因此默认为false。至于你的上一个案例,很多语言(C,Perl等)都认为非零整数是真的,所以MySQL只是支持这种范式。
答案 2 :(得分:2)
因为'string'既不是true也不是false,第一个表达式应该计算为布尔值。
为什么IF(1,...)评估为真?好问题。也许是对C的回归(即如果它是1,那么它是真的)?
编辑:实际上,通过http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if处命令的定义,如果expr1<>,则expr1为TRUE。 0和expr1<> NULL,表示expr1 == 1时的情况。
答案 3 :(得分:1)
请注意PHP中有相似之处:
"string" != 0 // false
"one" != 0 // false
"1" != 0 // true
混淆似乎是因为MySQL比较0(和null)来获得某事物的布尔值。在其他语言中,如PHP和Javascript,当转换为boolean时,字符串在非空(或非“0”)时返回true。
// php
0 == true // false
"string" == 0 // true*
"string" == true // true
// mysql
if(0, "true", "false") // false
if("string", "true", "false") // false*
如果您知道我的意思,那两条*
已加星标的*
行会显示相应的比较。