sql:带有声明变量的case表达式

x759pob2  于 2021-07-26  发布在  Java
关注(0)|答案(5)|浏览(442)

下面的示例在SQLServer中不起作用。table1.field1也是一个字符(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

有人知道案件陈述的问题吗?

qvtsj1bj

qvtsj1bj1#

结果 CASE 表达式必须赋给变量,但不允许在同一语句中从表中返回任何列。
因此:

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

请参阅简化的演示。

z3yyvxxp

z3yyvxxp2#

sql服务器 SELECT 语句既可以指定变量值,也可以返回行,但不能两者都指定。您可能打算:

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

这将为变量分配最大值——如果表只有一行,则是唯一的值。如果表中没有行,则会分配变量 'ALL' .

hpcdzsge

hpcdzsge3#

在这种情况下我会使用定标器函数

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
szqfcxe2

szqfcxe24#

像这样的表达 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
h7wcgrx3

h7wcgrx35#

太多了。对于create函数,我没有任何权限,我们不能在生产环境中执行。但会有用的。不错。
我用了福帕斯的例子,它非常适合我。

相关问题