【问题标题】:Can we use '=' for comparing with NULL in sql我们可以使用'='与sql中的NULL进行比较吗
【发布时间】:2016-01-11 09:54:14
【问题描述】:

我有表 t1 作为

  EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
------- ---------- --------- ---------- --------- ---------- ---------- ----------
   7369 SMITH      CLERK           7902 17-DEC-80        800                    20
   7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
   7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
   7566 JONES      MANAGER         7839 02-APR-81       2975                    20
   7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
   7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
   7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
   7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
   7839 KING       PRESIDENT            17-NOV-81       5000                    10
   7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
   7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

  EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
------- ---------- --------- ---------- --------- ---------- ---------- ----------
   7900 JAMES      CLERK           7698 03-DEC-81        950                    30
   7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
   7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
        NULL
        Null
        null
                   VP
-----------------------------------------------------------------------------

当我查询时

select * from t1 where ename=null

它返回“未选择行”。 据我所知,我们不能使用 '=' 与 null 进行比较。 那么为什么它没有显示错误。

【问题讨论】:

  • 答案是否定的,。你应该得到一个错误。
  • @jarlh:语法正确的 - 你不会得到错误
  • 正如另一个提到的is null 应该足够了,你的语法是正确的,但没有以正确的方式使用;但是,我很好奇不知道你设置了 NULL 值。这是由于看到的各种外壳。
  • @a_horse_with_no_name,根据 ANSI/ISO SQL-2003 的语法无效。也许对另一个旧/新版本更正确?
  • @jarlh: 嗯,我所知道的没有 DBMS 会为此引发语法异常(不过我同意这会很好)

标签: sql


【解决方案1】:

那么为什么它没有显示错误?

因为(表达式的)语法正确的。

然而——正如你已经指出的——即使表达式的语法是正确的,它也永远不会是真的

这类似于写where 1=2 - 这也是“正确的”,但永远不会返回任何行。

【讨论】:

    【解决方案2】:

    不,您不能将 = 用于空值,因为与 null 值比较会返回“未知”结果,结果集中不包含“未知”结果的行。请改用查询。

    select * from t1 where ename is null
    

    【讨论】:

    • 那不是问题
    • 更新了我对未返回行的原因的回答
    • 问题是“为什么这不会产生错误”,而不是为什么不返回任何行 - 萨拉姆已经提到了
    【解决方案3】:

    NULL 在大多数 SQL 风格中代表一个完全未知的值。在这种情况下,当将列与NULL 进行比较时,它无法评估为TRUE,因为这两个值都是完全未知的。从逻辑上讲,在 SQL 思维中比较“我不知道”和“我不知道”不会评估为 TRUE

    NULLNULL 进行比较的一个现实类比是将两张随机抽取的扑克牌相互比较。我们不能说有相等或不相等,因为我们从未见过它们。

    不要直接比较 NULL 值,而是尝试使用 IS NULL 构造:

    SELECT * FROM t1 WHERE ename IS NULL
    

    【讨论】:

      【解决方案4】:

      当然您可以使用=null 进行比较。结果是总是 将是unknown,当然,但这是一个与其他任何值一样的值。它与使用42 + null 或使用任何其他运算符没有根本不同。您是否真的想在使用 null 和某些运算符时遇到异常(或语法错误)?这会破坏null 的全部目的,不是吗?

      当然,将某些内容与 文字 null 进行比较很可能是一个错误,并且您可能会收到警告。但这也意味着文字的行为应该与“真实”值不同——你真的不希望这样。

      这主要类似于NaN 在浮点数中的工作方式。任何涉及NaN 的操作都会导致NaN - 除了isNaN,它类似于SQL 中的is null

      【讨论】:

        【解决方案5】:

        没有错误信息,因为没有错误。

        您可以将相等性与 NULL 进行比较。它总是返回 UNKKNOWN/NULL。如果您想知道 ename 是否为 NULL,请写 ename IS NULL

        SELECT 不能返回任何行。查询只返回与您所询问的内容相似的所有行。如果它们都不是那样,则不会返回任何内容。

        【讨论】:

          【解决方案6】:

          您必须使用IS NULL 而不是= 才能完成这项工作。

          SELECT * FROM t1 WHERE ename IS NULL
          

          如果您使用的是 SQL Server,SET ANSI NULL OFF
          设置 ANSI NULLS OFF 将使 NULL = NULL 比较返回 true

          也检查一下这个In SQL Server, what does “SET ANSI_NULLS ON” mean?

          比较两个 NULL 表达式时,结果取决于 ANSI_NULLS 设置:

          如果 ANSI_NULLS 设置为 ON,则结果为 NULL,遵循 ANSI 约定,即 NULL(或未知)值不等于另一个 NULL 或未知值。

          如果 ANSI_NULLS 设置为 OFF,则 NULL 与 NULL 比较的结果为 TRUE。

          将 NULL 与非 NULL 值进行比较总是会导致 FALSE2。

          【讨论】:

            【解决方案7】:

            我想因为 Null 没有任何意义,所以您正在寻找一些未知的值而一无所获。 如 T-SQL 帮助中所写:

            要确定表达式是否为 NULL,请使用 IS NULL 或 IS NOT NULL 而不是比较运算符(例如 = 或 !=)。比较 当一个或两个参数为 NULL 时,运算符返回 UNKNOWN。

            所以我认为,因为比较运算符返回 UNKNOWN 这不是错误,它只是 SQL 服务器的行为。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-02-08
              • 1970-01-01
              • 2017-11-08
              • 2023-03-12
              • 1970-01-01
              • 2018-01-18
              • 2015-05-31
              • 2011-02-14
              相关资源
              最近更新 更多