2017-10-06 72 views
0
--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] 

我沒有建立這個表,我只是試圖從它進行查詢。選擇列中的逗號分隔

我有一個名爲過濾器的表。它包含兩種類型,過濾器和工作列表。篩選器參考'filtercriteria'列中的工作列表。

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

我需要一個查詢來搜索過濾器,以確保所有的工作列表都被引用。例如,我希望能夠搜索上面的表格並返回WL3,因爲任何過濾器中都沒有引用WL3。

filtercriteria列中還有其他信息,所以我不確定如何去除除worklistKey信息之外的所有內容,並且返回的結果只是搜索未在任何Filter中引用的Worklist列表。

+0

因此,您需要選擇filtertype在哪裏「過濾」並檢查「worklistkey =」旁邊的所有數字,並且在給定行中可以有多個?然後將這些數字清楚地列出來,並將它與Filtername中「WL」旁邊顯示的數字進行比較,其中filtetype是「worklist」? –

+0

正確。一個過濾器可以有很多worklistKey引用,甚至沒有。 – Pryach

+0

工作列表鍵是否像你的例子一樣總是引用filterid?也就是說,'worklistKey = 2',但實際上是'filterid = 2'? –

回答

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的行)。

這會爲您提供過濾器引用的工作清單的清單列表,您必須從所有過濾器列表中左鍵單擊才能完成此過程。如果現實與你的樣本有很大不同,可能會變得混亂。

+0

感謝您的解決方案。在我的現實中,filterid實際上是uniqueidentifier而不是int,所以我無法用其他東西替換ISNUMERIC行。 – Pryach

+0

您不需要過濾器,它們過濾的行將永遠不會連接到唯一標識符,我們要過濾的值就像'filter_after_hours_offset = 0time_of_day_begin = 00:00'。 –