2010-03-26 122 views
0

我想通过使用具有多个CASE语句的单个SELECT将查找表中包含的值分配给多个变量。使用单个SELECT语句和CASE将表值赋给多个变量?

该表有两列像这样的查询表:

[GreekAlphabetastic] 

    SystemID Descriptor 
    -------- ---------- 
    1   Alpha 
    2   Beta 
    3   Epsilon 

这是我的语法:

SELECT 

    @VariableTheFirst = 
     CASE 
      WHEN myField = 'Alpha' THEN tbl.SystemID 
     END, 

    @VariableTheSecond = 
     CASE 
      WHEN myField = 'Beta' THEN tbl.SystemID 
     END, 

    @VariableTheThird = 
     CASE 
      WHEN myField = 'Epsilon' THEN tbl.SystemID 
     END 

FROM GreekAlphabetastic tbl 

然而,当我检查变量,这个语句的执行,我希望每个被赋予适当的值,但是只有最后的具有分配的值。

SELECT 
    @VariableTheFirst AS First, 
    @VariableTheSecond AS Second, 
    @VariableTheThird AS Third 

Results: 

    First Second Third 
    NULL  NULL  3 

我在做什么错?

回答

2

第2个变量被重置的安排,为空。即当它碰到Epsilon记录时,前2个变量被分配为空,因为在CASE语句中没有任何东西可以阻止它。

所以,试试这个:

SELECT  
    @VariableTheFirst = 
     CASE 
      WHEN Descriptor = 'Alpha' THEN tbl.SystemID 
      ELSE @VariableTheFirst 
     END, 

    @VariableTheSecond = 
     CASE 
      WHEN Descriptor = 'Beta' THEN tbl.SystemID 
      ELSE @VariableTheSecond 
     END, 

    @VariableTheThird = 
     CASE 
      WHEN Descriptor = 'Epsilon' THEN tbl.SystemID 
      ELSE @VariableTheThird 
     END 
FROM GreekAlphabetastic tbl 
+1

这个工作,但如果表是大三从使用WHERE(和索引)会更快。 – 2010-03-26 16:47:18

+0

@AdaTheDev:谢谢,我现在明白出了什么问题! :) @KM:幸运的是,这只是一张只有少量记录的查找表,不管怎样,它在不久的将来都不会添加更多的附加记录。 – 2010-03-26 18:04:37

3

当从SELECT中分配局部变量时,只有最后一行处理会影响变量。对于第三行,CASE myField = 'Alpha'CASE myField = 'Beta'是错误的,变量设置为NULL。该CASE myField = 'Epsilon'是真实的,@VariableTheThird分配3.

,如果你想要这个工作做到这一点:

SELECT @VariableTheFirst = tbl.SystemID WHERE myField = 'Alpha' 
SELECT @VariableTheSecond = tbl.SystemID WHERE myField = 'Beta' 
SELECT @VariableTheThird = tbl.SystemID WHERE myField = 'Epsilon' 
0
SELECT  
     CASE 
      WHEN Descriptor = 'Alpha' THEN @VariableTheFirst = isnull(@VariableTheFirst,tbl.SystemID) 
      WHEN Descriptor = 'Beta' THEN @VariableTheSecond = isnull(@VariableTheSecond,tbl.SystemID) 
      WHEN Descriptor = 'Epsilon' THEN @VariableTheThird = isnull(@VariableTheThird,tbl.SystemID) 
     END 
FROM GreekAlphabetastic tbl 
+2

THEN后不允许使用语句(如赋值语句),只允许使用表达式。 – DyingCactus 2010-03-26 17:03:51

相关问题