o独立进行每次检查,并将结果合并在一起。@Yuck和我都有答案,可以帮你解决这个问题。+1有没有任何情况下它不会短路?@MarkBannister-是的,但它们有缺陷(在SQL Server中)。基本上,我所看到的唯一情况是,与变量的聚合进行比较(CASE
o独立进行每次检查,并将结果合并在一起。@Yuck和我都有答案,可以帮你解决这个问题。+1有没有任何情况下它不会短路?@MarkBannister-是的,但它们有缺陷(在SQL Server中)。基本上,我所看到的唯一情况是,与变量的聚合进行比较(CASE,sql,sql-server,Sql,Sql Server,o独立进行每次检查,并将结果合并在一起。@Yuck和我都有答案,可以帮你解决这个问题。+1有没有任何情况下它不会短路?@MarkBannister-是的,但它们有缺陷(在SQL Server中)。基本上,我所看到的唯一情况是,与变量的聚合进行比较(CASE WHEN MAX(@var).)。它将对它们进行求值,但仍然返回正确的值。您可能需要将它们合并在一起,而不是进行连接(可能是使用coalesce语句进行外部连接)。假设任何给定的输入记录只有一个条件为真。即使如此,这也需要针对每个条件扫描源数
o独立进行每次检查,并将结果合并在一起。@Yuck和我都有答案,可以帮你解决这个问题。+1有没有任何情况下它不会短路?@MarkBannister-是的,但它们有缺陷(在SQL Server中)。基本上,我所看到的唯一情况是,与变量的聚合进行比较(
CASE WHEN MAX(@var).
)。它将对它们进行求值,但仍然返回正确的值。您可能需要将它们合并在一起,而不是进行连接(可能是使用coalesce语句进行外部连接)。假设任何给定的输入记录只有一个条件为真。即使如此,这也需要针对每个条件扫描源数据集一次,因此需要对数据进行100次扫描。@Dems:是的,这也可以。OP问题中的ELSE
条件写为ELSE
,因此列并不完全相同。我在回答中“修正”了这一点,但它可能不是一个拼写错误。好的方面,我不会假设拼写错误,它可能是相关的,因此对于其他结果,要求value2中的null。对于其他99个条件?(这给出了2个字段,但只针对1个条件)使用UNION,每个条件一个子查询。@Dems:您也可以在这里使用“或”(我编辑了我的示例以适应它),虽然代码对于有经验的人来说可能很容易理解,但初学者可能需要一个解释。请添加一个解释,说明您的代码是做什么的,以及它是如何解决问题的。
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>
WITH C1 AS (
SELECT a1 AS value1, b1 AS value2
FROM table
WHERE condition1
), C2 AS (
SELECT a2 AS value1, b2 AS value2
FROM table
WHERE condition2
), C3 AS (
SELECT a3 AS value1, b3 AS value2
FROM table
WHERE condition3
)
SELECT value1, value2
FROM -- some table, joining C1, C2, C3 CTEs to get the cased values
;
SELECT * FROM
(SELECT val1, val2 FROM table1 WHERE (condition1 is true)
OR (condition2 is true))
UNION
SELECT * FROM
(SELECT val5, val6 FROM table7 WHERE (condition9 is true)
OR (condition4 is true))
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>
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
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
SELECT
xmlcol.value('(value1)[1]', 'NVARCHAR(MAX)') AS value1,
xmlcol.value('(value2)[1]', 'NVARCHAR(MAX)') AS value2
FROM
(SELECT CASE
WHEN <condition 1> THEN
CAST((SELECT a1 AS value1, b1 AS value2 FOR XML PATH('')) AS XML)
WHEN <condition 2> THEN
CAST((SELECT a2 AS value1, b2 AS value2 FOR XML PATH('')) AS XML)
ELSE
CAST((SELECT a3 AS value1, b3 AS value2 FOR XML PATH('')) AS XML)
END AS xmlcol
FROM <table>) AS tmp
SELECT
String_to_array(CASE
WHEN <condition 1> THEN a1||','||b1
WHEN <condition 2> THEN a2||','||b2
ELSE a3||','||b3
END, ',') K
FROM <table>
SELECT
a1,
a2,
a3,
...
WHERE <condition 1>
AND (<other conditions>)
UNION
SELECT
b1,
b2,
b3,
...
WHERE <condition 2>
AND (<other conditions>)
UNION
SELECT
...
-- and so on