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
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
构建一个存储过程,
这可能是一个良好的开端ING点: http://www.codeproject.com/KB/database/SQLArrayParameterHandling.aspx
问候, //牛逼
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
;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.87546' vs' 0.0000035'因为它调用XML阅读器。不确定任何情况下,这将是有益的,因为它会失败,如果字符串包含“<”例如? – 2011-04-20 09:39:05
@Martin - 你是对的。我投了你的解决方案:)。 – 2011-04-20 09:42:27
@Cristian,嗨,我试过与案例陈述,但如果有我能够做的列中的单个值,但如果有多个值用冒号分隔有点困难 – 2011-04-20 09:11:16