在MySQL中为什么这个IF返回false?

时间:2009-09-14 19:04:05

标签: mysql if-statement

在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'

评估他们的行为......

4 个答案:

答案 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*

如果您知道我的意思,那两条*已加星标的*行会显示相应的比较。