不幸的是,基本的方法是重复自己。
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 等价物,并且所有条件could对于所有返回值,它们需要被设计成一次只能有一个为真。
EDIT
如果Yuck的答案改为UNION而不是JOIN方法,它就变得与此非常相似。然而,主要区别在于,这只扫描输入数据集一次,而不是每个条件扫描一次(在您的情况下为 100 次)。
EDIT
我也注意到你may意味着 CASE 语句返回的值是固定的。所有符合相同条件的记录都会得到完全相同的值在值 1 和值 2 中。这可以这样形成......
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