如何将我的 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 行的主要内容,如果未能解决你的问题,请参考以下文章