在列中使用逗号分隔进行SELECT

时间:2017-10-06 17:11:38

标签: sql sql-server

--Create/Populate [#Filters]:
if object_id('tempdb..[#Filters]','U') is not null drop table [#Filters]
go
create table [#Filters]
(
 [filterid] int
 ,[filtertype] varchar(50)
 ,[filtername] varchar(50)
 ,[filtercriteria] nvcarchar(max)
)
go
set nocount on
insert [#Filters] select 1, 'Worklist', 'WL1', 'ID_SlotAssignmentFolder=1'
insert [#Filters] select 2, 'Worklist', 'WL2', 'ID_SlotAssignmentFolder=2'
insert [#Filters] select 3, 'Worklist', 'WL3', 'ID_SlotAssignmentFolder=3'
insert [#Filters] select 4, 'Filter', 'Filter1', 'filter_after_hours_offset=0,time_of_day_begin=00:00,worklistKey=1'
insert [#Filters] select 5, 'Filter', 'Filter2', 'filter_after_hours_offset=0,time_of_day_begin=00:00,worklistKey=1,worklistKey=2'
insert [#Filters] select 6, 'Filter', 'Filter3', 'filter_after_hours_offset=0,time_of_day_begin=00:00,worklistKey=2'
go
--select * from [#Filters]

我没有构建这个表,我只是想从中查询。

我有一个名为Filters的表。它包含两种类型,过滤器和工作列表。过滤器参考'过滤器标准中的工作清单'列。

在上面的例子中,Filter1引用WL1,Filter2引用WL1和WL2,Filter3引用WL2。

我需要一个查询来搜索过滤器以确保所有工作列表都被引用。例如,我希望能够搜索上表并返回WL3,因为WL3未在任何过滤器中引用。

filtercriteria列中还有其他信息,因此我不确定如何删除除worklistKey信息之外的所有信息,并且返回的信息只是搜索任何过滤器中未引用的工作列表

1 个答案:

答案 0 :(得分:1)

在SQL Server中,您可以使用XML功能将分隔字段解析为多行:

SELECT DISTINCT REPLACE(LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))),',','') AS filters
FROM
    (SELECT filterid,CAST('<XMLRoot><RowData>' + REPLACE(filtercriteria,'worklistKey=','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
     FROM   #Filters
     WHERE filtertype = 'Filter'
    )t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)
WHERE ISNUMERIC(REPLACE(LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))),',','')) = 1

在这种情况下,我们使用'worklistKey ='作为要解析的分隔符,并使用ISNUMERIC()检查来过滤掉非数字(没有worklistKey的行)。

这将为您提供过滤器引用的工作列表的独特列表,您必须从所有过滤器列表中进行左连接才能完成此操作。如果现实与您的样本有很大不同,可能会变得混乱。