首页 > 解决方案 > SQL-忽略空值而不按顺序打印

问题描述

我正在尝试将每个转换状态打印到新行,但 SQL 查询忽略了空值

下面是我的实际表格。old 对应旧状态,new 对应新状态。timestamp 是表的唯一唯一键。

 id    name old new timestamp
12342   sas NULL Ld 8/28/18 9:01:45
12342   sas Ld  Ld  8/28/18 9:01:50
12342   sas Ld  Ld  8/28/18 9:01:51
12342   sas Ld  Ld  8/28/18 9:02:12
12342   sas Ld  Rd  8/28/18 9:09:45
12342   sas Rd  Rd  9/1/18 16:19:56
12342   sas Rd  Rd  9/6/18 13:58:37
12342   sas Rd  rsf 9/6/18 13:58:39
12342   sas rsf rsf 9/6/18 13:59:25
12342   sas NULL Ld 12/21/18 4:41:34
12342   sas Ld  Ld  12/21/18 4:41:43
12342   sas Ld  Ld  12/21/18 4:41:49
12342   sas Ld  PUB 12/21/18 4:41:56

我消除了冗余行并仅打印状态发生变化的行(NULL 到 LD,LD 到 Rd 等等)

一旦我消除了这一行,表格应该如下所示

id  name old    new timestamp
12342   sas NULL    Ld  1/1/19 1:45:45
12342   sas Ld      Rd  1/1/19 1:55:34
12342   sas Rd      RSF 1/3/19 15:52:21
12342   sas NULL    Ld  1/4/19 1:10:23
12342   sas Ld      Rd  1/7/19 12:05:54
12342   sas Rd      LP  1/7/19 12:23:45
12342   sas LP      Pub 1/14/19 14:23:25

我正在使用以下查询进行过滤,但它没有给我所需的输出

select id, name, old, new, date
from tablex
where Id in ( 12342)
and  old != new
order by  date asc

标签: sqlsql-servertsql

解决方案


听起来您正在被大多数 SQL 实现中布尔表达式的 TRI 级性质所困扰。除了返回 TRUE 或 FALSE,还有第三种可能的结果。当一个或多个被比较的值是 NULL(又名缺失)时,结果是 NULL 而不是 TRUE 或 FALSE。

因此,您必须明确说明查询中的 NULL 值。就像是:

and not ( (review_status_old=review_status_new)
       or (review_status_old is null and review_status_new is null)
        )

推荐阅读