2017-12-20 3 views
0

TSQL에서 부울 값을 기반으로하는 특정 값에 대해 많은 열을 만들어야합니다.case 문에 중첩 된 If 문 TSQL

C1 | C2 | EdittedCol | 
----------------------- 
0 | 1 | not allowed 
1 | 1 | allowed 
1 | 0 | not allowed 
and so on... 

IF 문으로이 작업을 수행하는 더 좋은 방법은 현재 여러 가지로 중첩되어 있습니다.

SELECT C1, C2, 
     CASE when C1 = 1 and C2 = 1 then 'allowed' else 
      CASE when C1 = 0 then 'not allowed - C1 = 0' else 
      CASE when C2 = 0 then 'not allowed - C2 = 0' 
     end end end as EdittedCol 
FROM myTestTable 

반환 값 :

C1 | C2 | EdittedCol | 
----------------------- 
0 | 1 | not allowed - C1 = 0 
1 | 1 | allowed 
1 | 0 | not allowed - C2 = 0 
and so on... 
+0

질문은 무엇입니까? 표시된 코드가 올바른 결과를 산출합니까? 그렇지 않다면 왜 안 되겠습니까? 아니면 더 좋은 방법이 있는지 묻는 것입니까? 'if' 문으로 멀리까지 가지 않을 것입니다. 왜냐하면 그것은 절차 적 코드를위한 것이지,'select' 문과 같은 set-based 코드가 아니기 때문입니다. –

+0

@underscore_d는 더 나은 방법을 요구합니다. 결과를 표시하도록 수정합니다. – Travis

답변

1

을 사용할 필요가 무엇을하고 있는지 이해합니다.

DECLARE @EdittedCol TABLE (C1 INT, C2 INT) 
INSERT INTO @EdittedCol VALUES 
(0,1), 
(1,1), 
(1,0), 
(0,0) -- I also added 0-0 scenario 


;WITH UNPVT AS 
(
    SELECT *, CASE WHEN VALUE = 0 THEN COL + ' = ' + CAST(VALUE AS varchar) ELSE '' END NotAllowedCol 
    FROM 
     (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) RN, C1, C2 FROM @EdittedCol) AS SRC 
      UNPIVOT(VALUE FOR COL IN ([C1],[C2])) UNPVT 
) 
SELECT C1, C2, 
    CASE WHEN C1 * C2 = 1 
    THEN 'allowed' 
    ELSE 'not allowed - ' + STUFF(EdittedCol,1,1,'') END EdittedCol 
FROM (SELECT RN, VALUE, COL FROM UNPVT) SRC 
PIVOT(MAX(VALUE) FOR COL IN ([C1],[C2])) PVT 
CROSS APPLY (SELECT ',' + NotAllowedCol FROM UNPVT WHERE UNPVT.RN = PVT.RN AND VALUE = 0 FOR XML PATH('')) X(EdittedCol) 

결과 :

C1   C2   EdittedCol 
----------- ----------- ----------------------------------------- 
0   1   not allowed - C1 = 0 
1   1   allowed 
1   0   not allowed - C2 = 0 
0   0   not allowed - C1 = 0,C2 = 0 
0

난 당신이 당신이 만드는 이것에 대한 PIVOTUNPIVOT를 사용할 수있는 & 비트 연산자를

SELECT C1, C2, C3, 
    case C1 & C2 & C3 when 1 then 'Allowed' ELSE 'Not Allowed' END AS EdittedCol 
FROM myTestTable;