欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【SQL Server学习笔记】17:CASE表达式和T-SQL的NULL

程序员文章站 2024-01-03 11:57:40
...

CASE表达式

CASE是一个标量表达式(注意不是语句,语句可以做某些处理,表达式只返回值),基于条件逻辑来返回一个值。因为是标量表达式所以可以支持任何标量表达式,如SELECT、WHERE、HAVING、ORDER BY、CHECK约束。

[1]简单表达式

将一个值与一组可能的值进行比较:

USE MyDB;
SELECT myid,firstname,lastname,Pid,
    CASE Pid
        WHEN 1012 THEN '上海大学'
        WHEN 1000 THEN '宝山'
        WHEN 1033 THEN '益新'
        WHEN 1027 THEN '教育超市'
    END AS newcase --新的列名
FROM dbo.ok;

【SQL Server学习笔记】17:CASE表达式和T-SQL的NULL

[2]搜索表达式

在WHEN子句中指定谓词或逻辑表达式,而不限于只进行相等性比较:

USE MyDB;
SELECT myid,firstname,lastname,Pid,
    CASE
        WHEN Pid=1012 THEN '上海大学'
        WHEN Pid=1000 THEN '宝山'
        WHEN Pid=1033 THEN '益新'
        WHEN Pid=1027 THEN '教育超市'
    END AS newcase --新的列名
FROM dbo.ok;

【SQL Server学习笔记】17:CASE表达式和T-SQL的NULL
可以看到每个CASE简单表达式都可以转换成CASE搜索表达式。

T-SQL对NULL值的处理

前面学了SQL支持的三值谓词有TRUE、FALSE和UNKNOWN。前两者很好理解,在不同的语境下,SQL对UNKNOWN的处理不同。SQL对查询过滤器的条件的处理是”接受TRUE”(也就是拒绝FALSE和UNKNOWN),对CHECK约束的条件的处理是”拒绝FALSE”(也就是接受TRUE和UNKNOWN)。

对UNKNOWN取反的结果仍然是UNKNOWN。对NULL值进行比较的表达式结果是UNKNOWN,这是最普遍的,此外NULL和NULL进行比较结果也是UNKNOWN,为此SQL用IS NULL和IS NOT NULL来取代=NULL和<>NULL以作正确的NULL判断。

先修改表的内容,让它有几个NULL值用来实验:
【SQL Server学习笔记】17:CASE表达式和T-SQL的NULL

用查询过滤器做过滤:

USE MyDB;
SELECT myid,firstname,lastname,Pid
FROM dbo.ok
WHERE Pid=1012;

【SQL Server学习笔记】17:CASE表达式和T-SQL的NULL

USE MyDB;
SELECT myid,firstname,lastname,Pid
FROM dbo.ok
WHERE Pid<>1012;

【SQL Server学习笔记】17:CASE表达式和T-SQL的NULL
可以看到无论是=还是<>都过滤掉了NULL,因为和NULL做比较时返回的是UNKNOWN,而查询过滤器的条件是”接受TRUE”。

同样地,下面这种方式得到的永远是UNKNWON,所以返回了一个空表。

USE MyDB;
SELECT myid,firstname,lastname,Pid
FROM dbo.ok
WHERE Pid=NULL;

【SQL Server学习笔记】17:CASE表达式和T-SQL的NULL

想要匹配NULL需要用IS NULL的方式:

USE MyDB;
SELECT myid,firstname,lastname,Pid
FROM dbo.ok
WHERE Pid IS NULL;

【SQL Server学习笔记】17:CASE表达式和T-SQL的NULL

此外应注意,SQL Server在处理唯一约束、分组、排序时将多个NULL值视为相等的。其它SQL可能不这样做。

上一篇:

下一篇: