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

如果您知道我的意思,那两个*已加星标的<=>行会显示等效的比较。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top