2010-01-15 4 views
22

이 사이트를 광범위하게 검색했지만 해결책을 찾을 수 없습니다. SQL Server에서 CASE WHEN 내에 여러 열을 어떻게 선택합니까?

SELECT 
    ActivityID, 

    Hours = (CASE 
       WHEN ActivityTypeID <> 2 THEN 
        FieldName = (Some Aggregate Sub Query), 
        FieldName2 = (Some other aggregate sub query) 
       WHEN ActivityTypeID = 2 THEN 
        FieldName = (Some Aggregate Sub Query with diff result), 
        FieldName2 = (Some Other Aggregate Sub Query with diff result) 
      END) 

분명히 내가 쿼리를 많이 밖으로 떠날거야, 난 그냥 가능하다면보고 싶어 : 여기

내 쿼리의 예입니다. 내가 아마 두 번 "CASE"를 수행하지만 물어 거라 생각 할 수 알고

...

감사합니다!

+0

관련 질문이지만 중복되지는 않습니다. http://stackoverflow.com/q/13713316/2420536 –

답변

26

문제는 CASE 문을 사용하는 방식으로 작동하지 않는다는 것입니다. 이 매개 변수를 사용하여 쿼리의 한 필드 값만 전환 할 수 있습니다.

SELECT 
    ActivityID, 
    FieldName = CASE 
        WHEN ActivityTypeID <> 2 THEN 
         (Some Aggregate Sub Query) 
        ELSE 
        (Some Aggregate Sub Query with diff result) 
       END, 
    FieldName2 = CASE 
        WHEN ActivityTypeID <> 2 THEN 
         (Some Aggregate Sub Query) 
        ELSE 
        (Some Aggregate Sub Query with diff result) 
       END 
12

아니요, CASE은 하나의 값만 반환 할 수 있습니다. 나는 당신이 당신의 CASE 논리를 복제해야 할 것이라고 생각한다.

다른 옵션은 IF로 전체 쿼리를 래핑하고 결과를 반환하는 두 개의 별도 쿼리를 갖는 것입니다. 쿼리의 나머지 부분을 보지 않고도 해당 쿼리가 효과가 있는지 여부를 말하기는 어렵습니다.

1

"케이스"오직 하나의 값을 반환 할 수 있습니다,하지만 당신은 복잡한 유형을 사용할 수 있습니다 : 당신이 뭘 하려는지 이해한다면, 당신은이 필요할 수 있습니다

create type foo as (a int, b text); 
select (case 1 when 1 then (1,'qq')::foo else (2,'ww')::foo end).*; 
+2

저는 Postgres에서 가능하지만 sql-server는 아닙니다 (질문에 태그가 지정되어 있음) – dsz

0

은 실제로 당신이 할 수있는 그것.

비록 누군가가 CASE 문장을 반복하는 것이 나쁘지는 않다는 것을 알아야합니다. SQL Server의 쿼리 최적화 프로그램은 CASE을 두 번 실행하지 않을 정도로 똑똑하기 때문에 성능상의 이유로 인해 성능이 저하되지 않습니다. (당신을 맞는 경우 ..)

는 또한 누군가가

INSERT INTO dbo.T1 
(
    Col1, 
    Col2, 
    Col3 
) 
SELECT 
    1, 
    SUBSTRING(MyCase.MergedColumns, 0, CHARINDEX('%', MyCase.MergedColumns)), 
    SUBSTRING(MyCase.MergedColumns, CHARINDEX('%', MyCase.MergedColumns) + 1, LEN(MyCase.MergedColumns) - CHARINDEX('%', MyCase.MergedColumns)) 
FROM 
    dbo.T1 t 
LEFT OUTER JOIN 
(
    SELECT CASE WHEN 1 = 1 THEN '2%3' END MergedColumns 
) AS MyCase ON 1 = 1 

이 값을 삽입 할 CASE를 반복하지 않도록 다음과 같은 논리를 사용할 수 있습니다 (1, 2, 3) 테이블의 각 레코드에 대해 T1. 이 경우 구분자 '%'을 사용하여 병합 된 열을 분할합니다. 필요에 따라 자신 만의 분할 기능을 작성할 수 있습니다 (예 : null 레코드 처리 또는 varchar 필드 등의 복잡한 구분 기호 사용). 그러나 주 논리는 CASE 문에 조인하고 분할 논리를 사용하여 조인의 결과 집합에서 선택해야한다는 것입니다.