我这里有这个 SQL 代码:
with first_cte as (
select *,
case
when var1 = 1 then 'a'
when var1 = 0 then 'b'
end as new_var_1,
case
when var3 > var2 then 'c'
end as new_var_2,
case
when var5 > var2 then 'c'
end as new_var_3,
case
when var4 > var2 then 'c'
end as new_var_4
from my_table
),
second_cte as (
select *,
case
when new_var_2 = 'c' or new_var_3 = 'c' or new_var_4 = 'c' then 'c'
else null
end as new_var_5
from first_cte
)
select *,
case
when new_var_2 = 'c' or new_var_3 = 'c' or new_var_4 = 'c' or new_var_5 = 'c' then 'c'
else new_var_1
end as final
from second_cte;
在这里,我使用一系列 CASE WHEN 语句来识别表中的某些条件。最后,一旦确定了所有条件,我就会将它们全部组合成一个新变量。
我试图通过将所有内容都包含在一个 CASE WHEN 语句中来提高效率,但我发现之前的一些条件被覆盖了。这种新方法确保没有任何内容被覆盖。
还有没有办法让这段代码更短,同时确保没有条件被覆盖?
考虑以下使用 TSQL 解决 FizzBang 的方法:
DECLARE @Table TABLE (ID INT);
;WITH cte AS (
SELECT 1 as ID
UNION ALL
SELECT ID+1
FROM cte
WHERE ID < 21
)
INSERT INTO @Table (ID)
SELECT ID
FROM cte;
/* Method one */
SELECT ID, STRING_AGG(Fizz,', ') AS FizzBang
FROM (
SELECT ID, CASE WHEN ID % 3 = 0 THEN 'Fizz' END AS Fizz
FROM @Table
UNION ALL
SELECT ID, CASE WHEN ID % 5 = 0 THEN 'Bang' END AS Bang
FROM @Table
) a
GROUP BY ID;
/* Method two */
SELECT ID, CASE WHEN ID % 3 = 0 THEN 'Fizz' ELSE '' END + CASE WHEN ID % 5 = 0 THEN 'Bang' ELSE '' END AS FizzBang
FROM @Table;
/* Method three */
SELECT ID, CASE WHEN ID % 3 = 0 AND ID % 5 = 0 THEN 'Fizz, Bang'
WHEN ID % 3 = 0 THEN 'Fizz'
WHEN ID % 5 = 0 THEN 'Bang'
END AS FizzBang
FROM @Table;
方法一: 利用
STRING_AGG
函数,我们生成两个结果集,一个用于嘶嘶声,一个用于爆炸声,并将它们聚合在一起。这使得组合两个 case 表达式的操作相当简单。
身份证 | 嘶嘶声 |
---|---|
1 | |
2 | |
3 | 嘶嘶声 |
4 | |
5 | 砰 |
6 | 嘶嘶声 |
7 | |
8 | |
9 | 嘶嘶声 |
10 | 砰 |
11 | |
12 | 嘶嘶声 |
13 | |
14 | |
15 | 嘶嘶声,嘭嘭 |
16 | |
17 | |
18 | 嘶嘶声 |
19 | |
20 | 砰 |
21 | 嘶嘶声 |
方法二: 在这里,我们使用两个单独的 case 表达式,当未找到匹配项时返回空白并将它们连接在一起。当您想使用可选分隔符(“Fizz,Bang”或“Fizz”或“Bang”)时,这可能会变得复杂。
身份证 | 嘶嘶声 |
---|---|
1 | |
2 | |
3 | 嘶嘶声 |
4 | |
5 | 砰 |
6 | 嘶嘶声 |
7 | |
8 | |
9 | 嘶嘶声 |
10 | 砰 |
11 | |
12 | 嘶嘶声 |
13 | |
14 | |
15 | 嘶嘶声 |
16 | |
17 | |
18 | 嘶嘶声 |
19 | |
20 | 砰 |
21 | 嘶嘶声 |
方法三: 这种方法从一开始就定义了 case 表达式中的所有三种可能的结果。该案例将始终返回第一个真实条件,因此我们将“Fizz,Bang”放在顶部,然后是“Fizz”,然后是“Bang”。更改该顺序将导致“Fizz, Bang”永远不会返回。
身份证 | 嘶嘶声 |
---|---|
1 | |
2 | |
3 | 嘶嘶声 |
4 | |
5 | 砰 |
6 | 嘶嘶声 |
7 | |
8 | |
9 | 嘶嘶声 |
10 | 砰 |
11 | |
12 | 嘶嘶声 |
13 | |
14 | |
15 | 嘶嘶声,嘭嘭 |
16 | |
17 | |
18 | 嘶嘶声 |
19 | |
20 | 砰 |
21 | 嘶嘶声 |