SQL 案例中的许多布尔表达式

Posted

技术标签:

【中文标题】SQL 案例中的许多布尔表达式【英文标题】:Many Boolean expressions in SQL Case 【发布时间】:2021-04-08 11:31:33 【问题描述】:

我有一个关于 SQL Case 块中的布尔表达式的问题。我正在使用 Oracle 数据库。 列名将由在每个案例块末尾声明的别名创建。

有没有办法减少这个 SQL Case 代码示例?

【问题讨论】:

您需要仔细检查CASE 表达式中的条件。 CASE 表达式执行逻辑短路,即它们在满足第一个条件时停止处理。在您的情况下,您的第二个和第三个条件是第一个条件的子集,因此实际上永远不会达到它们。此外,您的第二个条件是第三个条件的子集,因此即使您交换条件以首先执行最具选择性的条件(按照惯例),您的第二个条件也永远不会达到! 【参考方案1】:

您可以通过在CTE 中计算一次条件 来摆脱重复的谓词,并在查询中重用它,如下所示

with cte as
(select
    CASE
        WHEN complex condition No 1
           THEN 1
        WHEN complex condition No 2
           THEN 2
        WHEN complex condition No 3
           THEN 3
    END condition_id,
 a.*
 from my_example_table a
)
select
    value_of_column_47, 
    CASE
        WHEN condition_id = 1 
           THEN 6
        WHEN condition_id = 2 
           THEN value_of_column_18
        WHEN condition_id = 3 
           THEN value_of_column_82
    END my_first_reached_value,
...
 from cte

【讨论】:

【参考方案2】:

您可以使用编写三个查询三个条件并使用 union all 来组合如下:

SELECT
    value_of_column_55,
    value_of_column_47, 
    6 my_first_reached_value,
    44 my_second_reached_value,
    77 my_third_reached_value

FROM my_example_table
WHERE      column_a = 1 AND column_b = 2
UNION ALL

SELECT
    value_of_column_55,
    value_of_column_47, 
    value_of_column_18 my_first_reached_value,
    value_of_column_66 my_second_reached_value,
    value_of_column_89 my_third_reached_value

FROM my_example_table
WHERE      column_a = 1 AND coulmn_b = 2 AND column_c = 8

UNION ALL

SELECT
    value_of_column_55,
    value_of_column_47, 
    value_of_column_82 my_first_reached_value,
    'Some_hardcodedtext' my_second_reached_value,
    'Some_hardcodedtext_again' my_third_reached_value

FROM my_example_table
WHERE      column_a = 1 AND column_b = 2 AND (column_c = 8 or column_r = 22)

但恐怕条件提到得当。你的第二个和第三个条件是不可达的,因为第一个条件是假的,第二个或第三个条件是真的。

当第二个条件为真时,第一个条件为真,当第三个条件为真时,第一个和第二个条件都为真。

请分享示例输入和所需输出,以便我们帮助您构建适当的条件。

【讨论】:

以上是关于SQL 案例中的许多布尔表达式的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql 流程控制语句

PL/SQL流程控制

T-SQL 函数在调用时表现为布尔表达式?

sql 在示例上显示布尔表达式。检查日期是否过去

LeetCode:Database 98.计算布尔表达式的值

LeetCode:Database 98.计算布尔表达式的值