2017-10-06 17 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] 

私はこのテーブルを作成しませんでした。カンマ区切りのカンマで区切られた

私はフィルタと呼ばれるテーブルを持っています。フィルタとワークリストの2種類があります。フィルタは 'filtercriteria'列のワークリストを参照します。

上記の例では、Filter1はWL1、Filter2参照WL1およびWL2、およびFilter3参照WL2を参照しています。

すべてのワークリストが参照されていることを確認するために、フィルタを検索するクエリが必要です。たとえば、WL3がいずれのフィルタでも参照されていないため、上記のテーブルを検索してWL3を返すことができるようにします。

filtercriteriaの列には他の情報がありますので、worklistKey情報以外のすべてを削除する方法はわかりません。返された場合、どのフィルタでも参照されていないワークリストを検索します。 SQL Serverでの

+0

フィルタタイプが 'フィルタ'の場所を選択し、 'worklistkey ='の横にあるすべての数字を確認する必要があります。次に、それらの番号の明確なリストを取り出し、filetypeが 'worklist'であるfilternameの 'WL'の隣に表示される数字と比較します。 –

+0

正しい。フィルタには、多くのworklistKey参照を含めることができます。 – Pryach

+0

worklistkeysは、あなたの例のように常にfilteridを参照していますか?つまり、 'worklistKey = 2'と表示されますが、実際には 'filterid = 2'を意味していますか? –

答えて

1

あなたは複数行に区切られたフィールドを解析するXML機能を使用することができます。

我々は上の解析、およびに ISNUMERIC()チェックを使用する区切り文字として「worklistKey =」を使用この場合
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を持たない行)をフィルタリングします。

これは、フィルタによって参照されるワークリストの明確なリストを取得します。これを完了するには、すべてのフィルタのリストから左結合する必要があります。現実があなたのサンプルと大きく異なる場合、混乱するかもしれません。

+0

ソリューションをありがとう。私の現実では、実際にはfilteridはintではなくuniqueidentifierであるため、ISNUMERIC行を何か他のものに置き換えるのに問題があります。 – Pryach

+0

フィルタは必要ありません。フィルタされた行は一意識別子に結合されません。フィルタリングする値は 'filter_after_hours_offset = 0time_of_day_begin = 00:00'と同じです。 –

関連する問題