【问题标题】:Is there a SQL mode for MySQL allowing "WHERE x = NULL" (meaning "WHERE x IS NULL")?MySQL 是否有允许“WHERE x = NULL”(意思是“WHERE x IS NULL”)的 SQL 模式?
【发布时间】:2013-12-16 13:02:41
【问题描述】:

我知道在 SQL 语句的 WHERE 子句中使用 column = NULL 会导致结果集为空。

由于这在编程环境中效率非常低,我正在寻找一种方法让 MySQL 像 column IS NULL 一样解释 column = NULL,也许通过设置 SQL 模式?

【问题讨论】:

  • “效率低”但正确
  • 您可以改用<=>。不过我不会。这不是便携式的。
  • 不清楚你在问什么
  • @ling.s - 我似乎并不清楚,他们要求的 MySQL 相当于 SET ANSI_NULLS OFF.
  • 这不是低效的。这只是理解语言的问题。

标签: mysql


【解决方案1】:

您可以改用<=>。不过我不会。这不是便携式的。

(感谢 Martin Smith pointed me to 这是我的问题的解决方案)

【讨论】:

    【解决方案2】:

    您可以在 WHERE 子句中使用 case 语句来使用正确的语法:

    http://www.postgresql.org/docs/9.4/static/functions-conditional.html

    SELECT * FROM my_items WHERE 
        CASE WHEN 1=1 THEN mac = '08:00:2b:01:02:03'
             WHEN 1=2 THEN mac IS NULL
        END;
    

    显然,在本例中将始终调用第一种情况 (WHEN 1=1)。您可以将自己的逻辑放入满足您的条件。

    【讨论】:

      【解决方案3】:

      嗯,至少 PostgreSQL 确实有一个参数

      transform_null_equals = true
      

      当设置为true时,查询解析器会转换

      field = NULL
      

      field is NULL
      

      事先。有些东西告诉我在 MySQL 记录较少的参数中隐藏了一个等效参数。

      自 2020 年 7 月 15 日起编辑

      我的“不是真正的解决方案”可能是我在 SO 的第一个答案之一。我有点羞于回答关于另一个 DBRMS 引擎的问题,而不是 OP 询问我的问题。

      无论如何,正确的答案是使用 <=> 运算符,正如其他人已经在他们的答案中所说的那样。您为此替换=,它将表现为其他比较:

       A = B  // zero if different, one if equals, this is treated as a boolean result
       A != NULL // always null, therefore not false nor true.  
       A <=> B // zero if different, one if equals, zero is one of the variables are null, 1 if both are. 
      

      这不是一个设置,因此它的行为永远不会是会话明智的或 DDBB 明智的。

      【讨论】:

      • 这是一个 postgres 设置 @ffflabs 吗?我们很想设置它,所以它总是真实的。开发人员一直在写 field = x 忘记了 null 的情况,所以当 null 被传递时,我们就搞砸了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      相关资源
      最近更新 更多