![]() |
逃课的充电器 · Mockito不能mock ...· 1 年前 · |
![]() |
讲道义的甘蔗 · Linux tail命令:显示文件结尾的内容· 1 年前 · |
![]() |
大方的泡面 · 商汤 ChatGPT「商量」炸场!秒生 ...· 1 年前 · |
![]() |
才高八斗的西瓜 · 如何用Python只读取一个目录中的wav文件?· 1 年前 · |
我正在编写一个SQL查询,其中返回的一些列需要根据相当多的条件进行计算。
我目前使用的是嵌套的case语句,但它变得越来越混乱。有没有更好的(更有条理和/或更具可读性的)方法?
(我使用的是Microsoft SQL Server,2005)
一个简化的例子:
SELECT
col1,
col2,
col3,
WHEN condition
WHEN condition1
WHEN condition2
THEN calculation1
ELSE calculation2
WHEN condition2
THEN calculation3
ELSE calculation4
WHEN condition1
WHEN condition2
THEN calculation5
ELSE calculation6
WHEN condition2
THEN calculation7
ELSE calculation8
END AS 'calculatedcol1',
col4,
col5 -- etc
FROM table
用户定义的函数可能会更好地服务,至少可以隐藏逻辑- esp。如果需要在多个查询中执行此操作
我个人就是这样做的,限制了嵌入的CASE表达式。我还会添加注释来解释正在发生的事情。如果它太复杂了,就把它分解成函数。
SELECT
col1,
col2,
col3,
CASE WHEN condition THEN
CASE WHEN condition1 THEN
CASE WHEN condition2 THEN calculation1
ELSE calculation2 END
CASE WHEN condition2 THEN calculation3
ELSE calculation4 END
ELSE CASE WHEN condition1 THEN
CASE WHEN condition2 THEN calculation5
ELSE calculation6 END
ELSE CASE WHEN condition2 THEN calculation7
ELSE calculation8 END
END AS 'calculatedcol1',
col4,
col5 -- etc
FROM table
下面是嵌套的“复杂”case语句的简单解决方案:--嵌套的Case复杂表达式
select datediff(dd,Invdate,'2009/01/31')+1 as DaysOld,
case when datediff(dd,Invdate,'2009/01/31')+1 >150 then 6 else
case when datediff(dd,Invdate,'2009/01/31')+1 >120 then 5 else
case when datediff(dd,Invdate,'2009/01/31')+1 >90 then 4 else
case when datediff(dd,Invdate,'2009/01/31')+1 >60 then 3 else
case when datediff(dd,Invdate,'2009/01/31')+1 >30 then 2 else
case when datediff(dd,Invdate,'2009/01/31')+1 >30 then 1 end
end as Bucket
from rm20090131atb
只需确保每个case语句都有一个end语句
把所有的箱子都包起来。
SELECT
col1,
col2,
col3,
WHEN condition1 THEN calculation1
WHEN condition2 THEN calculation2
WHEN condition3 THEN calculation3
WHEN condition4 THEN calculation4
WHEN condition5 THEN calculation5
ELSE NULL
END AS 'calculatedcol1',
col4,
col5 -- etc
FROM table
您可以组合多个条件来避免这种情况:
CASE WHEN condition1 = true AND condition2 = true THEN calculation1
WHEN condition1 = true AND condition2 = false
ELSE 'what so ever' END,
我们可以将多个条件组合在一起,以减少性能开销。
假设有三个变量a,b,c,我们想要对它们进行计算。我们可以这样做:
CASE WHEN a = 1 AND b = 1 AND c = 1 THEN '1'
WHEN a = 0 AND b = 0 AND c = 1 THEN '0'
ELSE '0' END,