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 的示例,它非常适合我。
我有以下示例在 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 的示例,它非常适合我。