SQL: 带有已声明变量的 CASE 表达式

SQL: CASE expression with declared variable

我有以下示例在 SQL 服务器中不起作用。 table1.field1 也是一个 char(3)

DECLARE @CALCULATED_FIELD char(3);

SELECT table1.field1
       ,table1.field2
       ,CASE 
            WHEN table1.field2 = '1' THEN @CALCULATED_FIELD = table1.field1
            ELSE @CALCULATED_FIELD = 'ALL'
       END
FROM table1

有人知道 case 语句的问题吗?

A SQL 服务器 SELECT 语句可以 分配变量值或 return 行,但不能同时分配两者。您可能打算:

SELECT @CALCULATED_FIELD = COALESCE(table1.field1, 'ALL')
FROM table1;

这会将最大值分配给变量 -- 如果 table 只有一行,则为唯一值。如果 table 没有行,变量将被分配 'ALL'.

CASE 表达式的结果必须分配给变量,但不允许在同一语句中 return 来自 table.[=25 的任何列=] 所以这个:

SELECT  
  @CALCULATED_FIELD = CASE 
    WHEN field2 = '1' THEN field1 
    ELSE 'ALL' 
  END 
FROM table1

在语法上是有效的,尽管它最终会分配给变量,最后一行的 CASE 表达式的结果。

根据变量的名称,我怀疑您想要一个 3d 列,它将由 CASE:

计算
SELECT field1, field2, 
  CASE 
    WHEN field2 = '1' THEN field1 
    ELSE 'ALL' 
  END calculated_field
FROM table1

查看简化版 demo.

在这种情况下我会使用缩放器功能

CREATE FUNCTION calcfield
  (
   @field2 VARCHAR(4),
   @field1 VARCHAR(4)
   )  
  RETURNS VARCHAR(3)
   AS
   BEGIN
   DECLARE @CalcField CHAR(3)
   SELECT @CalcField = CASE 
       WHEN @field2 = '1' THEN  @field1
        ELSE  'ALL'
    END 
   RETURN @CalcField
  END
 GO

然后将您的查询更改为

  SELECT table1.field1
   ,table1.field2
   ,dbo.calcfield(table1.field2,table1.field1) 
  FROM table1

A=B 等表达式不是标量值。所以当你 运行 下面的查询时,它会失败,你会得到一个错误 Incorrect syntax near '='.

SELECT ('aaa' = 'aaa')

你的情况

CASE WHEN table1.field2 = '1'
THEN @CALCULATED_FIELD = table1.field1
ELSE @CALCULATED_FIELD = 'ALL'
END

不是有效的表达式,您可能指的是

CASE WHEN table1.field2 = '1'
THEN (CASE WHEN @CALCULATED_FIELD = table1.field1 THEN 1 ELSE 0)
ELSE (CASE WHEN @CALCULATED_FIELD = 'ALL' THEN 1 ELSE 0)
END

请注意,您可以运行查询

SELECT columnName = 'aaa'

它的工作原理是

SELECT 'aaa' AS columnName

非常感谢。 对于创建功能,我没有权限,我们不能在生产环境中进行。但会工作。不错

使用了 forpas 的示例,它非常适合我。