首页 > 解决方案 > CROSS APPLY 用于 CASE 表达式

问题描述

使用 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]

基本分析

两个查询的结果相同,执行计划也相似。

标签: sqlsql-server-2014

解决方案


您可以在子句的, ,或后面rating多次引用。SELECTWHEREGROUP BYFROM

这是定义多次引用的列的便捷方式。


推荐阅读