Застрял в SQL-запрос - PullRequest
       1

Застрял в SQL-запрос

1 голос
/ 20 апреля 2011

HI

Я застрял в сценарии, где у меня есть столбец, как

          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

Ответы [ 3 ]

3 голосов
/ 20 апреля 2011
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 голосов
/ 20 апреля 2011
;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    
0 голосов
/ 20 апреля 2011

построить хранимую процедуру,

это может быть хорошей отправной точкой: http://www.codeproject.com/KB/database/SQLArrayParameterHandling.aspx

С уважением, // т

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...