2010-03-26 1 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

첫 번째 두 변수는 할당 후 null로 재설정되고있다. 즉 Epsilon 레코드에 도달하면 CASE 문에서이를 방지 할 수있는 것이 없으므로 처음 2 개의 변수가 null로 할당됩니다.

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 (및 인덱스)를 사용하여 세 및 선택 빨라집니다 :

그래서, 이것을 시도. –

+0

@AdaTheDev : 감사합니다. 이제 잘못 된 것을 이해합니다! :) @KM : 다행스럽게도이 레코드는 소수의 레코드가있는 조회 테이블 일 뿐이며 가까운 미래에 몇 가지 레코드가 추가 될 것입니다. –

3

SELECT에서 로컬 변수에 대입을 지정하면 처리 된 마지막 행만 변수에 영향을 미칩니다. 세 번째 행의 경우 CASE myField = 'Alpha'CASE myField = 'Beta'은 false이고 변수는 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

관련 문제