在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...
您可以使用PIVOT
和UNPIVOT
来实现此目的。
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
如果我理解你在做什么,你需要使用&bitwise运算符
SELECT C1, C2, C3,
case C1 & C2 & C3 when 1 then 'Allowed' ELSE 'Not Allowed' END AS EdittedCol
FROM myTestTable;