gpt4 book ai didi

sql - SQL中的case语句,如何返回多个变量?

转载 作者:行者123 更新时间:2023-12-02 00:20:39 28 4
gpt4 key购买 nike

我想在我的 case 语句中返回多个值,例如:

SELECT
CASE
WHEN <condition 1> THEN <value1=a1, value2=b1>
WHEN <condition 2> THEN <value1=a2, value2=b2>
ELSE <value1=a3, value3=b3>
END
FROM <table>

当然我可以多次编写case条件,每次返回一个值。但是,由于我有很多条件需要拟合,比如说100。一次又一次地重复case条件是不好的。

我想问的另一个问题是,如果一条记录符合多个条件会发生什么?这是否意味着它将返回所有这些或仅返回最后一个?例如条件 1 可能成为条件 2 的子集。会发生什么?

最佳答案

不幸的是,基本方法是重复自己。

SELECT
CASE WHEN <condition 1> THEN <a1> WHEN <condition 2> THEN <a2> ELSE <a3> END,
CASE WHEN <condition 1> THEN <b1> WHEN <condition 2> THEN <b2> ELSE <b3> END
FROM
<table>

幸运的是,大多数 RDBMS 都足够聪明,不必多次评估条件。这只是多余的打字。


在 MS SQL Server (2005+) 中,您可以使用 CROSS APPLY 作为替代方案。虽然我不知道它的性能如何......

SELECT
*
FROM
<table>
CROSS APPLY
(
SELECT a1, b1 WHERE <condition 1>
UNION ALL
SELECT a2, b2 WHERE <condition 2>
UNION ALL
SELECT a3, b3 WHERE <condition 3>
)
AS case_proxy

这里值得注意的缺点是没有 ELSE 等价物,并且由于所有条件可能都返回值,因此需要对它们进行设计,以便一次只能有一个为真。


编辑

如果Yuck的答案改为UNION而不是JOIN方法,它就会变得与此非常相似。然而,主要区别在于,这只扫描输入数据集一次,而不是每个条件一次(在您的情况下为 100 次)。


编辑

我还注意到您可能的意思是CASE语句返回的值是固定的。匹配相同条件的所有记录都会在 value1 和 value2 中获得完全相同的值。这可以这样形成......

WITH
checked_data AS
(
SELECT
CASE WHEN <condition1> THEN 1
WHEN <condition2> THEN 2
WHEN <condition3> THEN 3
...
ELSE 100
END AS condition_id,
*
FROM
<table>
)
,
results (condition_id, value1, value2) AS
(
SELECT 1, a1, b1
UNION ALL
SELECT 2, a2, b2
UNION ALL
SELECT 3, a3, b3
UNION ALL
...
SELECT 100, a100, b100
)
SELECT
*
FROM
checked_data
INNER JOIN
results
ON results.condition_id = checked_data.condition_id

关于sql - SQL中的case语句,如何返回多个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8358642/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com