2011-04-20 96 views
1

HI在SQL查询滞留

我被困在一个场景中,我有一个像

  testColumn 
      A;B;C;D;E 
      A;B 
      C;D 

我想作为单独的列输出(我的列数像下面的例子有一个列始终5列)

  A B C D E 
     x x x x x 
     x x 
      X X 
+0

@Cristian,嗨,我试过与案例陈述,但如果有我能够做的列中的单个值,但如果有多个值用冒号分隔有点困难 – 2011-04-20 09:11:16

回答

3
WITH T(C) AS 
(
SELECT 'A;B;C;D;E' UNION ALL 
SELECT 'A;B' UNION ALL 
SELECT 'C;D' 
) 
SELECT 
     CASE WHEN CHARINDEX('A',C) > 0 THEN 'X' ELSE '' END AS 'A', 
     CASE WHEN CHARINDEX('B',C) > 0 THEN 'X' ELSE '' END AS 'B', 
     CASE WHEN CHARINDEX('C',C) > 0 THEN 'X' ELSE '' END AS 'C', 
     CASE WHEN CHARINDEX('D',C) > 0 THEN 'X' ELSE '' END AS 'D', 
     CASE WHEN CHARINDEX('E',C) > 0 THEN 'X' ELSE '' END AS 'E' 
FROM T 

使你想要的结果

A B C D E 
---- ---- ---- ---- ---- 
X X X X X 
X X    
      X X  
0
;with TestTable(testColumn) as 
(
    select 'A;B;C;D;E' union all 
    select 'A;B' union all 
    select 'C;D' 
) 

select 
    case when n.r.exist('r[.="A"]') = 1 then 'X' else '' end as A, 
    case when n.r.exist('r[.="B"]') = 1 then 'X' else '' end as B, 
    case when n.r.exist('r[.="C"]') = 1 then 'X' else '' end as C, 
    case when n.r.exist('r[.="D"]') = 1 then 'X' else '' end as D, 
    case when n.r.exist('r[.="E"]') = 1 then 'X' else '' end as E 
from TestTable 
    cross apply (select cast('<r>'+replace(testColumn, ';', '</r><r>')+'</r>' as xml)) n(r) 

结果

A B C D E 
---- ---- ---- ---- ---- 
X X X X X 
X X    
      X X  
+1

与我的答案相比,这似乎有一个明显更昂贵的整体估计子树成本'1.87546' vs' 0.0000035'因为它调用XML阅读器。不确定任何情况下,这将是有益的,因为它会失败,如果字符串包含“<”例如? – 2011-04-20 09:39:05

+1

@Martin - 你是对的。我投了你的解决方案:)。 – 2011-04-20 09:42:27