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