防止 CASE WHEN 语句覆盖以前的语句

问题描述 投票:0回答:1

我这里有这个 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 语句中来提高效率,但我发现之前的一些条件被覆盖了。这种新方法确保没有任何内容被覆盖。

还有没有办法让这段代码更短,同时确保没有条件被覆盖?

sql netezza
1个回答
0
投票

考虑以下使用 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 嘶嘶声
© www.soinside.com 2019 - 2024. All rights reserved.