sql - 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
解决方案
听起来您正在被大多数 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)
)