为什么SQL团队引入了SET ANSI_NULLS ON

时间:2015-02-16 13:12:20

标签: sql-server tsql

我读了一篇有趣的文章here

它告诉我写SET ANSI_NULLS ON时,SQL Server会以不同的方式对NULL值进行比较。网站上给出的例子如下:

 SET ANSI_NULLS ON IF NULL = NULL  PRINT 'same' ELSE  PRINT 'different'
 --result:  different

 SET ANSI_NULLS ON IF NULL IS NULL  PRINT 'same' ELSE  PRINT 'different'
 -- result: same

虽然我能理解文字,但我无法理解why did the SQL have to behave this way ?

  1. 为什么我们不能只使用=。它背后的意图是什么?为什么我们被迫使用IS NULL种语法?
  2. sql server的未来版本中,set ansi-nulls on似乎是默认的。
  3. 背后肯定有一个原因。任何人都可以向我解释一下吗?

    根据@Blams的回答,我试过下面的代码。无论我们设置ansi nulls to on or off还是同样的结果。

    create table A
    (
    id int identity not null,
    name varchar null
    )
    
    create table B
    (
    id int identity not null,
    name varchar null
    )
    
    insert into A (name) values ('a')
    insert into B (name) values ('b')
    insert into A (name) values (null)
    insert into B (name) values (null)
    
    set ansi_nulls off
    select A.name, B.name from A join B on A.name = B.name
    
    set ansi_nulls on
    select A.name, B.name from A join B on A.name = B.name
    

    结果集:  --None -

    两者似乎都在返回空行。如果我执行SET ANSI_NULLS OFF,它应该比较null=null并返回true,正确吗?那为什么没有结果返回?

1 个答案:

答案 0 :(得分:0)

如果你想使用=那么只需要SET ANSI_NULLS OFF。

如果我在a.name = b.name上进行连接,我几乎不想在null上进行匹配。