如何将我的 CASE 语句限制为每次评估 1 行

Posted

技术标签:

【中文标题】如何将我的 CASE 语句限制为每次评估 1 行【英文标题】:How do I restrict my CASE statement to 1 row per evaluation 【发布时间】:2018-05-17 16:47:27 【问题描述】:

所以我有一个包含 2 行的简单查询:

SELECT DISTINCT
    o.OrderNo,
    CASE
        WHEN od.PartNo LIKE '%Amend%' AND od.User_Currency2 IS NOT NULL THEN od.User_Currency2
        WHEN od.PartNo LIKE '%Amend%' AND od.User_Currency1 IS NOT NULL THEN od.User_Currency1
        ELSE o.OrderTotal
        END AS [OrderTotal] 
FROM OrderDet od
   JOIN Orders o ON od.OrderNo = o.OrderNo
WHERE o.OrderNo LIKE '%E'
ORDER BY o.OrderNo

在我的 CASE 语句中,对于每个订单,如果满足第一个条件,我希望它只返回那个条件并忽略其他 2 个选项,条件 #2 相同,如果前 2 个条件失败,则默认为其他

问题是我每个订单都有多行,如下所示:

如何将每个订单限制为 1 条记录?我认为 CASE 语句是按顺序评估的,只会吐出 1 个值,但在我的情况下,每个订单都会从每个订单的 CASE 语句返回多个结果

【问题讨论】:

case 表达式返回单个值 PER ROW,这就是它正在做的事情。对于订单 20228E,您想要 OrderTotal 的哪个值? 优先级基于我在 CASE 语句中列出它们的方式,所以如果 User_Currency2 字段不为空,则我首先需要它,然后是 Curr1,如果这两个字段都为空,然后是 OrderTotal 【参考方案1】:

使用由 User_Currency2/User_Currency1 值联合和过滤的一系列查询,如下所示:

SELECT DISTINCT
    o.OrderNo,
    od.User_Currency2 AS [OrderTotal]
FROM OrderDet od
   JOIN Orders o ON od.OrderNo = o.OrderNo
WHERE
  o.OrderNo LIKE '%E' AND
  od.PartNo LIKE '%Amend%' AND
  od.User_Currency2 IS NOT NULL
UNION
SELECT DISTINCT
    o.OrderNo,
    od.User_Currency2 AS [OrderTotal]
FROM OrderDet od
   JOIN Orders o ON od.OrderNo = o.OrderNo
WHERE
  o.OrderNo LIKE '%E' AND
  od.PartNo LIKE '%Amend%' AND
  od.User_Currency2 IS NULL AND
  od.User_Currency1 IS NOT NULL
UNION
SELECT DISTINCT
    o.OrderNo,
    od.OrderTotal
FROM OrderDet od
   JOIN Orders o ON od.OrderNo = o.OrderNo
WHERE
  o.OrderNo LIKE '%E' AND
  od.PartNo LIKE '%Amend%' AND
  od.User_Currency2 IS NULL AND
  od.User_Currency1 IS NULL
ORDER BY
  o.OrderNo

【讨论】:

以上是关于如何将我的 CASE 语句限制为每次评估 1 行的主要内容,如果未能解决你的问题,请参考以下文章

java 8 不可达语句 switch case 语句

就像在 CASE 语句中没有按预期进行评估一样

LISTAGG 被评估并在无法访问的 case 语句中失败

如何使用 python 将我的置信度数限制为小数点后两位? [复制]

将switch case作为一般案例

如何将我的应用程序限制为仅适用于 iPhone [重复]