在SQL中,是否有类似COALESCE()的条件来限定非NULL的列值?

时间:2019-08-01 17:59:01

标签: sql sql-server

我有一个"Order"Table which houses "Status"Column. Values under Status = ('Completed','Sold','In-Process','Released','NotStarted')

即使表中没有序列或层次结构,我们也可以看到如下序列。

1   NotStarted
2   Released
3   In-Process
4   Sold
5   Completed

因此,“已完成”是最高状态,每个订单都要经过这些状态,直到完成为止。如果尚未完成,则应处于其他状态之一。

当我选择“已完成”时,我会错过其他记录。当我包含所有状态时,我会获得多个相同订单的记录,例如1个记录为Released,1个记录为InProcess,等等(即订单的各个阶段)

select * from OrderTable
where Status = 'Completed'

我想有能力做这样的事情- COALESCE(Completed,Sold,In-Process,Released,NotStarted, NULL)

换句话说,我想获得该状态的最高记录,而每个订单仅获得1条记录。

在Sql中有可能吗?

2 个答案:

答案 0 :(得分:6)

一种选择是将ROW_NUMBER()与Case表达式一起使用来建立订单。

SELECT *
FROM
    (
       SELECT OrderNumber,
        Status,
        ROW_NUMBER() OVER (PARTITION BY OrderNumber ORDER BY 
                           CASE Status 
                               WHEN 'NotStarted' THEN 1
                               WHEN 'Released' THEN 2
                               WHEN 'In-Process' THEN 3
                               WHEN 'Sold' THEN 4
                               WHEN 'Completed' THEN 5 
                               END DESC) as Order_Status_Rank
        FROM OrderTable
    ) dt
WHERE Order_Status_Rank = 1;

See it in action here

答案 1 :(得分:0)

如果使用列表中显示的数字而不是文本,则只需选择“前1”并按数字排序。您可以使用另一个表来存储号码/输入数据。顺便说一下,这还可以防止错误的数据输入。