2016-04-12 3 views
1

У меня есть таблица со строкой в ​​некоторых значениях столбцов, которая говорит мне, следует ли удалять строку ... однако эта строка нуждается в синтаксическом анализе, чтобы понять, следует ли удалять или нет.Разбор строки в SQL с оператором If

Что такое строка: она говорит мне о повторении встреч, например, каждый день, начиная 21-й марш на 10 заседаний.

Моя таблица представляет собой один столбец называется recurrence:

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 

Что делать: если встречи закончены затем удалить строку.

Строка имеет следующий формат

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

Например

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

каждодневного начиная с 21-го марта, в 10 раз

Кто-нибудь знает, как я бы вычислить, если строка указывает все встречи в прошлом? Мне нужен оператор select, который говорит мне, если значения повторения находятся в прошлом - true или false

ответ

2

Я добавил одну строку ('weekly;1;21/05/2016;times;4'), которая определенно не должна быть удалена, чтобы показать какой-то результат. Сначала попробуйте добавить в таблицу temp `@ 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

Например CASE WHEN how = 'daily' THEN dateadd (day, howmany, since) WHEN how = ... END будут даты, которые вы можете сравнить с текущей датой. – gofr1