--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信息之外的所有信息,并且返回的信息只是搜索任何过滤器中未引用的工作列表
答案 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的行)。
这将为您提供过滤器引用的工作列表的独特列表,您必须从所有过滤器列表中进行左连接才能完成此操作。如果现实与您的样本有很大不同,可能会变得混乱。