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 案例中的许多布尔表达式的主要内容,如果未能解决你的问题,请参考以下文章