我有一个这样的选择语句:
SELECT
ID, NAME, AGE, LOCATION, GPF, ACCNO,
CASE
WHEN .... AS Indicator1,
CASE
WHEN .... AS Indicator2, ....
FROM
EMPLOYEES
我有几个
Indicator
列有复杂的 case 语句。
接下来,根据指标,我需要创建更多列。
示例:
;WITH cte AS
(
SELECT
ID, NAME, AGE, LOCATION, GPF, ACCNO,
CASE WHEN .... AS Indicator1,
CASE WHEN .... AS Indicator2,
....
FROM
EMPLOYEES
)
SELECT
*,
CASE
WHEN Indicator1 = 0 AND Indicator2 = 1
THEN 'SDM1'....
END AS Class1,
CASE
WHEN .....
END
FROM
CTE
另一种方法是将第一个 select 填充到临时表中,然后对临时表执行 select 并引用 Indicator 列。
示例:
SELECT
ID, NAME, AGE, LOCATION, GPF, ACCNO,
CASE WHEN .... END AS Indicator1,
CASE WHEN .... END AS Indicator2,
....
INTO
#TMP1
FROM
EMPLOYEES;
SELECT
*,
CASE
WHEN Indicator1 = 0 AND Indicator2 = 1
THEN 'SDM1'....
END AS Class1,
CASE WHEN ..... END
FROM
#TMP1
有时我需要使用此级别的输出 - 即 Class1,...添加一些新列,这导致第三级。
使用 cte 或临时表运行似乎很耗时。我想知道 SQL 是否允许任何其他方法,我可以尝试从
SELECT
查询引用计算列(如 case 语句)?
SELECT
ID, NAME, AGE, LOCATION, GPF, ACCNO,
oa1.Indicator1,
oa1.Indicator2,
oa2.Class1,
oa3.lvl3
FROM EMPLOYEES
OUTER APPLY(SELECT
CASE WHEN .... AS Indicator1,
CASE WHEN .... AS Indicator2,
.... )oa1
OUTER APPLY(SELECT
CASE WHEN oa1.Indicator1 = 0 AND oa1.Indicator2 = 1
THEN 'SDM1'.... AS Class1 )oa2
OUTER APPLY(SELECT
CASE WHEN oa2.Class1 .... AS lvl3 )oa3
每个
CASE
变成OUTER APPLY
。