2016-04-12 11 views
1

私は行を削除する必要があるかどうかを示すいくつかの列の値の文字列を持つテーブルを持っていますが、この文字列は削除するかどうかを理解するために解析する必要があります。If文を使用してSQLで文字列を解析する

文字列とは何ですか?会議の再開を私に伝えます。例えば、毎日10回、10回の会議が始まります。

Recurrence 
------------------------------- 
daily;1;21/03/2015;times;10 
daily;1;01/02/2016;times;8 
monthly;1;01/01/2016;times;2 
weekly;1;21/01/2016;times;4 

行うにはどのような:会議が終了している場合は、行を削除

私のテーブルには、recurrenceと呼ばれる単一の列です。

文字列は、たとえば次のような形式

<frequency tag>;<frequency number>;<start date>;times;<no of times> 

の3月21日に開始

daily;1;21/03/2016;times;10 

日常で、10倍

のために誰もが文字列が示している場合、私は計算する方法を知っていますすべてのミーティングは過去ですか?繰り返し値が過去か真か偽かを示すselect文が必要です。

答えて

2

一部の出力を表示するために削除する必要のない1文字の文字列('weekly;1;21/05/2016;times;4')を追加しました。まず、テーブルのすべてのデータを一時テーブル `@ table1 'に追加し、すべてがうまく削除されているかどうかを確認してください。

DECLARE @table1 TABLE (
    Recurrence nvarchar(max) 
) 
DECLARE @xml xml 

INSERT INTO @table1 VALUES 
('daily;1;21/03/2016;times;10'), 
('daily;1;21/03/2015;times;10'), 
('daily;1;01/02/2016;times;8'), 
('monthly;1;01/01/2016;times;2'), 
('weekly;1;21/01/2016;times;4'), 
('weekly;1;21/05/2016;times;4') 


SELECT @xml= (
SELECT CAST('<s><r>' + REPLACE(Recurrence,';','</r><r>') + '</r><r>'+ Recurrence+'</r></s>' as xml) 
FROM @table1 
FOR XML PATH ('') 
) 

;WITH cte as (
SELECT t.v.value('r[1]','nvarchar(10)') as how, 
     t.v.value('r[2]','nvarchar(10)') as every, 
     CONVERT(date,t.v.value('r[3]','nvarchar(10)'),103) as since, 
     t.v.value('r[4]','nvarchar(10)') as what, 
     t.v.value('r[5]','int') as howmany, 
     t.v.value('r[6]','nvarchar(max)') as Recurrence 
FROM @xml.nodes('/s') as t(v) 
) 

DELETE t 
FROM @table1 t 
LEFT JOIN cte c ON c.Recurrence=t.Recurrence 
WHERE 
    CASE WHEN how = 'daily' THEN DATEADD(day,howmany,since) 
      WHEN how = 'weekly' THEN DATEADD(week,howmany,since) 
      WHEN how = 'monthly' THEN DATEADD(month,howmany,since) 
      ELSE NULL END < GETDATE() 

SELECT * FROM @table1 

出力:

Recurrence 
----------------------------- 
weekly;1;21/05/2016;times;4 

(1 row(s) affected) 
+0

たTHX gofr1。どのように私はこれを取ると、行を削除するかどうかを決定する私の要件を完了することができますか? – Fearghal

+0

@Fearghalは、さらに多くのデータサンプルを提供し、いくつかのガイダンスを追加して、文字列が通過するかどうかを判断します。また、あなたは毎日の変形を表示するだけで、他に何かありますか? – gofr1

+0

例:WHEN WHEN how = ... ENDここでは、現在の日付と比較できる日付があります。how = 'daily' THEN dateadd(day、howmany、since) – gofr1

関連する問題