2017-03-17 13 views
0

我有一个包含四列('YES,NO,N/A})值的表格。我想要得到的是一个带有连续名称的列,它们用双下划线表示'YES'值。在SQL Server中使用IF条件的CONCAT

\, A, B, C, D 
1, YES, NO, YES, N/A 
2, NO, YES, N/A, N/A 
3, YES, NO, NO, YES 

预期结果:

A__C 
B 
A__D 

喜欢的东西:

select CONCAT(
IF(A = 'YES', 'A'), 
IF(B = 'YES', 'B'), 
IF(C = 'YES', 'C'), 
IF(D = 'YES', 'D')) 
from my_table 
+0

使用['CASE'](https://msdn.microsoft.com/en-us/library/ms181765.aspx)。 – Siyual

回答

3

希望我明白你说得对,你想要一个双下划线分隔符。 此解决方案无需任何子查询或cte处理。

select substring(
      iif(a='YES','__A','') + iif(b='YES','__B','') + 
      iif(c='YES','__C','') + iif(d='YES','__D','') 
     ,3,100) 
from table1 

应该知道这个:substring('', 3, 100)将使用SqlServer。

+0

这工作得很好,似乎是更紧凑的解决方案。谢谢! – Nic

0
Select case A then 'YES' then 'A' else '_'end + case B then 'YES' then 'B' else '_'end +case C then 'YES' then 'C' else '_'end +case D then 'YES' then 'D' else '_'end as result from my_table 
0
WITH ABC 
as 
( 
Select 
    (
    CASE WHEN A = 'YES' THEN 'A_' ELSE '' END as A + 
    CASE WHEN B = 'YES' THEN 'B_' ELSE '' END as B + 
    CASE WHEN C = 'YES' THEN 'C_' ELSE '' END as C + 
    CASE WHEN D = 'YES' THEN 'D_' ELSE '' END as D 
    ) as output 
) 
Select case when len(output) = 2 then left (output,1) 
     else output 
     end as output 
From ABC 
2

假设T1是你的表:

SELECT CASE WHEN LEN(X)>0 THEN LEFT(X, LEN(X)-2) ELSE '' END AS Y 
FROM (
    SELECT 
    CASE WHEN A='YES' THEN 'A__' ELSE '' END + CASE WHEN B='YES' THEN 'B__' ELSE '' END + CASE WHEN C='YES' THEN 'C__' ELSE '' END + CASE WHEN D='YES' THEN 'D__' ELSE '' END AS X 
    FROM T1 
    ) A