【问题标题】:In MySQL why is this IF returning false?在 MySQL 中,为什么这个 IF 返回 false?
【发布时间】:2010-11-28 05:49:30
【问题描述】:

在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 if-statement


    【解决方案1】:

    因为 'string' 既不是真也不是假,第一个表达式的计算结果应该是布尔值。

    为什么 IF(1, ...) 的计算结果为真?好问题。也许是对 C 的回归(即如果它是 1,那么它就是真的)?

    编辑:实际上,根据http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if 处命令的定义,如果 expr1 0 且 expr1 NULL(即 expr1 == 1 时的情况),则 expr1 为 TRUE。

    【讨论】:

    • 你是绝对正确的,但显然这在 MySQL 中的处理方式不同,即期望似乎是 expr1 中发生了数字或布尔评估,这将排除使用字符串作为表达。
    【解决方案2】:

    The first argument given to IF() is a predicate。 MySQL 不将字符串视为谓词,因此它默认为 false。至于你的最后一种情况,很多语言(C、Perl 等)都认为非零整数是真的,所以 MySQL 只是支持这种范式。

    【讨论】:

      【解决方案3】:

      来自MySQL

      IF(expr1,expr2,expr3)

      如果 expr1 为 TRUE(expr1 0 且 expr1 NULL),则 IF() 返回 expr2;否则返回 expr3。 IF() 返回数字或字符串 值,取决于上下文 使用它。

      所以 1 为真,因为 1 != 0 和 1 != NULL。这就像您在 C 中看到的一样。

      但是对于一个字符串,说一个“测试”评估为真在定义中没有真正的基础,也没有逻辑意义。需要将其与布尔结果进行比较。

      【讨论】:

      • 烦人的是 SELECT IF('1', 'one', 'not one');返回“一个”
      • 那么 SELECT IF('2', 'two', 'not two'); 是做什么的??
      【解决方案4】:

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

      *starred* 的两条线显示了等效的比较,如果你明白我的意思的话。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多