tsql逗号分隔测试值

时间:2014-05-31 00:17:39

标签: tsql

我已经获得了一个包含几个字段的表,这些字段包含逗号分隔值(空白或Y / N),因此(存储此数据的字段名称为People_Notified):

Y,,N,
,Y,,N
,,N,Y

每个'插槽'与特定字段值有关,我现在需要在字符串中包含该特定字段名称(在本例中为Parent,Admin,Police和Medical),但是插入" N"如果当前值为空,但保留现有的Y和N.因此,对于上面的示例,有四个已知的插槽,我希望tsql语句最终得到:

Parent=Y,Admin=N,Police=N,Medical=N
Parent=N,Admin=Y,Police=N,Medical=N
Parent=N,Admin=N,Police=N,Medical=Y

我尝试使用CHARINDEX和CASE的组合,但还没有想出办法使这项工作。

JS

3 个答案:

答案 0 :(得分:1)

如果您能够在SQL Server中使用XQuery,我认为您不必太复杂。你可以这样做:

SELECT CONVERT(XML, REPLACE('<pn>' + REPLACE(People_Notified, ',', '</pn><pn>') + '</pn>', '<pn></pn>', '<pn>N</pn>')).query('
    concat("Parent=", data(/pn[1])[1], ",Admin=", data(/pn[2])[1], ",Police=", data(/pn[3])[1], ",Medical=", data(/pn[4])[1])
')
FROM ...

说明:通过用关闭和打开标记替换逗号,从原始分隔字符串构造类似XML的字符串。在开始处添加开始标记,在结尾添加结束标记。将每个空元素替换为包含&#34; N&#34;的元素。将类似XML的字符串转换为实际的XML数据,以便您可以使用XQuery。然后使用concat()和元素的正确索引连接您需要的内容&#39;数据

答案 1 :(得分:1)

虽然有点乱,但理论上可以用一个声明来完成:

select 
'Parent=' +stuff((stuff((stuff(
substring((replace(
(','+(replace((replace(@People_Notified,',,,',',N,N,')),',,',',N,'))+','),',,',',N,')),2,7),7,0,
'Medical=')),5,0,'Police=')),3,0,'Admin=')

细分更容易理解:

declare @People_Notified varchar(100)=',,Y,Y' -- test variable
-- Insert Ns
set @People_Notified= (select replace(@People_Notified,',,,',',N,N,')) -- case two consecutive missing 
set @People_Notified= (select replace(@People_Notified,',,',',N,')) -- case one missing 
set @People_Notified= (select replace((','+@People_Notified+','),',,',',N,')) -- case start or end missing 
set @People_Notified= substring(@People_Notified,2,7) -- remove extra commas added previously
-- Stuff the labels
select 'Parent=' +stuff((stuff((stuff(@People_Notified,7,0,'Medical=')),5,0,'Police=')),3,0,'Admin=')

答案 2 :(得分:0)

这是一种方法:

;WITH cteXML (Id, Notified)
AS
(
    SELECT Id,
    CONVERT(XML,'<Notified><YN>' 
        + REPLACE([notified],',', '</YN><YN>') 
        + '</YN></Notified>') AS Notified
    FROM People_Notified
)

select id, 
'Parent=' + case Notified.value('/Notified[1]/YN[1]','varchar(1)') when '' then 'N' else Notified.value('/Notified[1]/YN[1]','varchar(1)') end + ',' +
'Admin=' + case Notified.value('/Notified[1]/YN[2]','varchar(1)') when '' then 'N' else Notified.value('/Notified[1]/YN[2]','varchar(1)') end + ',' +
'Police=' + case Notified.value('/Notified[1]/YN[3]','varchar(1)') when '' then 'N' else Notified.value('/Notified[1]/YN[3]','varchar(1)') end + ',' +
'Medical=' + case Notified.value('/Notified[1]/YN[4]','varchar(1)') when '' then 'N' else Notified.value('/Notified[1]/YN[4]','varchar(1)') end Notified
from cteXML

SQL Fiddle

检查this page以获取有关XML内容正在执行的操作的说明。

This page详细介绍了将分隔字符串拆分成行的各种方法。