交叉申请 CASE 表达式
CROSS APPLY for CASE expressions
使用 CROSS APPLY 来封装 CASE 表达式是否有任何价值。让我用一个例子来解释这个问题。
数据设置
DECLARE @data AS TABLE([id] INT IDENTITY(1,1), [value] BIGINT);
INSERT INTO @data([value])
VALUES (100), (200), (7), (128), (315);
查询#1
以下查询在 SELECT 语句中使用传统的 CASE 表达式模式。
SELECT [id]
, [value]
, CASE WHEN [value] < 100 THEN 'CLASS-C'
WHEN [value] < 200 THEN 'CLASS-B'
ELSE 'CLASS-A' END AS [rating]
FROM @data
查询#2
将 CASE 表达式封装在 APPLY
SELECT [id]
, [value]
, [rating]
FROM @data
CROSS APPLY(SELECT CASE WHEN [value] < 100 THEN 'CLASS-C'
WHEN [value] < 200 THEN 'CLASS-B'
ELSE 'CLASS-A' END AS [rating]) AS [applied]
基本分析
两个查询的结果相同,执行计划也相似
您可以在 SELECT
、WHERE
、GROUP BY
或稍后的 FROM
子句中多次引用 rating
。
这是定义多次引用的列的便捷方法。
使用 CROSS APPLY 来封装 CASE 表达式是否有任何价值。让我用一个例子来解释这个问题。
数据设置
DECLARE @data AS TABLE([id] INT IDENTITY(1,1), [value] BIGINT);
INSERT INTO @data([value])
VALUES (100), (200), (7), (128), (315);
查询#1
以下查询在 SELECT 语句中使用传统的 CASE 表达式模式。
SELECT [id]
, [value]
, CASE WHEN [value] < 100 THEN 'CLASS-C'
WHEN [value] < 200 THEN 'CLASS-B'
ELSE 'CLASS-A' END AS [rating]
FROM @data
查询#2
将 CASE 表达式封装在 APPLY
SELECT [id]
, [value]
, [rating]
FROM @data
CROSS APPLY(SELECT CASE WHEN [value] < 100 THEN 'CLASS-C'
WHEN [value] < 200 THEN 'CLASS-B'
ELSE 'CLASS-A' END AS [rating]) AS [applied]
基本分析
两个查询的结果相同,执行计划也相似
您可以在 SELECT
、WHERE
、GROUP BY
或稍后的 FROM
子句中多次引用 rating
。
这是定义多次引用的列的便捷方法。