[SQL] SQL Server의 중첩 된 경우 문 로직을 수행하는 가장 좋은 방법은
SQLSQL Server의 중첩 된 경우 문 로직을 수행하는 가장 좋은 방법은
나는 열 몇이 조건의 꽤 많은에 따라 계산 될 필요가 반환하여 SQL 쿼리를 쓰고 있어요.
나는 현재 중첩 된 경우 문을 사용하고 있지만이 더러워지고. 더 나은 (더 조직 및 / 또는 읽을 수있는) 방법이 있나요?
(I 2005 Microsoft SQL Server를 사용하고 있습니다)
단순화 된 예 :
SELECT
col1,
col2,
col3,
CASE
WHEN condition
THEN
CASE
WHEN condition1
THEN
CASE
WHEN condition2
THEN calculation1
ELSE calculation2
END
ELSE
CASE
WHEN condition2
THEN calculation3
ELSE calculation4
END
END
ELSE
CASE
WHEN condition1
THEN
CASE
WHEN condition2
THEN calculation5
ELSE calculation6
END
ELSE
CASE
WHEN condition2
THEN calculation7
ELSE calculation8
END
END
END AS 'calculatedcol1',
col4,
col5 -- etc
FROM table
해결법
-
==============================
1.당신은 COALESCE 트릭, 예를 들어, 어떤 종류의를 시도해 볼 수도 있습니다 :
당신은 COALESCE 트릭, 예를 들어, 어떤 종류의를 시도해 볼 수도 있습니다 :
SELECT COALESCE( CASE WHEN condition1 THEN calculation1 ELSE NULL END, CASE WHEN condition2 THEN calculation2 ELSE NULL END, etc... )
-
==============================
2.하나에 모든 경우를 감싸.
하나에 모든 경우를 감싸.
SELECT col1, col2, col3, CASE WHEN condition1 THEN calculation1 WHEN condition2 THEN calculation2 WHEN condition3 THEN calculation3 WHEN condition4 THEN calculation4 WHEN condition5 THEN calculation5 ELSE NULL END AS 'calculatedcol1', col4, col5 -- etc FROM table
-
==============================
3.당신은 상황을 피하기 위해 여러 조건을 결합 할 수 있습니다 :
당신은 상황을 피하기 위해 여러 조건을 결합 할 수 있습니다 :
CASE WHEN condition1 = true AND condition2 = true THEN calculation1 WHEN condition1 = true AND condition2 = false ELSE 'what so ever' END,
-
==============================
4.나는 개인적으로 국한 포함 된 CASE 식을 유지, 그것은이 방법을한다. 또한 무슨 일이 일어나고 있는지 설명에 주석을 넣어 것입니다. 너무 복잡하다면, 함수로 그것을 밖으로 휴식.
나는 개인적으로 국한 포함 된 CASE 식을 유지, 그것은이 방법을한다. 또한 무슨 일이 일어나고 있는지 설명에 주석을 넣어 것입니다. 너무 복잡하다면, 함수로 그것을 밖으로 휴식.
SELECT col1, col2, col3, CASE WHEN condition THEN CASE WHEN condition1 THEN CASE WHEN condition2 THEN calculation1 ELSE calculation2 END ELSE CASE WHEN condition2 THEN calculation3 ELSE calculation4 END END ELSE CASE WHEN condition1 THEN CASE WHEN condition2 THEN calculation5 ELSE calculation6 END ELSE CASE WHEN condition2 THEN calculation7 ELSE calculation8 END END AS 'calculatedcol1', col4, col5 -- etc FROM table
-
==============================
5.여기에 중첩 된 "복잡한"case 문에 간단한 해결책이다 : --nested 케이스 복잡한 표현
여기에 중첩 된 "복잡한"case 문에 간단한 해결책이다 : --nested 케이스 복잡한 표현
select datediff(dd,Invdate,'2009/01/31')+1 as DaysOld, case when datediff(dd,Invdate,'2009/01/31')+1 >150 then 6 else case when datediff(dd,Invdate,'2009/01/31')+1 >120 then 5 else case when datediff(dd,Invdate,'2009/01/31')+1 >90 then 4 else case when datediff(dd,Invdate,'2009/01/31')+1 >60 then 3 else case when datediff(dd,Invdate,'2009/01/31')+1 >30 then 2 else case when datediff(dd,Invdate,'2009/01/31')+1 >30 then 1 end end end end end end as Bucket from rm20090131atb
그냥 있는지 확인 당신은 모든 경우 문에 대한 최종 문이
-
==============================
6.사용자 정의 함수는 서버 나은, 적어도 논리를 숨길 수 있습니다 - ESP. 당신은 둘 이상의 조회에서이 작업을 수행해야하는 경우
사용자 정의 함수는 서버 나은, 적어도 논리를 숨길 수 있습니다 - ESP. 당신은 둘 이상의 조회에서이 작업을 수행해야하는 경우
-
==============================
7.우리는 성능 오버 헤드를 줄이기 위해 함께 여러 조건을 결합 할 수 있습니다.
우리는 성능 오버 헤드를 줄이기 위해 함께 여러 조건을 결합 할 수 있습니다.
세 개의 변수 우리는 사건을 수행하고자하는 A B C는있다 보자. 우리는 다음과 같이이 작업을 수행 할 수 있습니다
CASE WHEN a = 1 AND b = 1 AND c = 1 THEN '1' WHEN a = 0 AND b = 0 AND c = 1 THEN '0' ELSE '0' END,
-
==============================
8.나는 그러나 @deejers에 의해 주어진에 답변을 추가하고 싶어,이를 통해 가서 모든 해답은 고급형 발견
나는 그러나 @deejers에 의해 주어진에 답변을 추가하고 싶어,이를 통해 가서 모든 해답은 고급형 발견
SELECT col1, col2, col3, CASE WHEN condition1 THEN calculation1 WHEN condition2 THEN calculation2 WHEN condition3 THEN calculation3 WHEN condition4 THEN calculation4 WHEN condition5 THEN calculation5 END AS 'calculatedcol1', col4, col5 -- etc FROM table
당신은 많은 시나리오에서 많은 도움이 될 것입니다, 그 필수하지 ELSE 선택을 할 수 있습니다.
-
==============================
9.이 예는 SQL case 문이있을 때처럼 보이게하는 방법, 그림 쇼 당신을 도울 수있는 경우와 루프의 경우 하나 이상의 내부
이 예는 SQL case 문이있을 때처럼 보이게하는 방법, 그림 쇼 당신을 도울 수있는 경우와 루프의 경우 하나 이상의 내부
from https://stackoverflow.com/questions/505747/best-way-to-do-nested-case-statement-logic-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 루프 - 레코드 집합을 통해 내가 루프를 어떻게 (0) | 2020.05.06 |
---|---|
[SQL] MySQL은 어떻게 행을 복사하지만 몇 가지 필드를 변경하려면? (0) | 2020.05.06 |
[SQL] 어떻게 MySQL은 현재 날짜 및 시간을 얻으려면? (0) | 2020.05.06 |
[SQL] 결과가 반환 SQL은 "여기서하지 하위 쿼리 선택" (0) | 2020.05.06 |
[SQL] 열에 고유 값의 수를 찾을 수 SQL (0) | 2020.05.06 |