使用If语句在SQL中解析字符串

时间:2016-04-12 14:02:53

标签: sql sql-server parsing

我有一个表格,其中包含某些列值中的字符串,告诉我是否应该删除该行....但是这个字符串需要一些解析才能理解是否要删除。

字符串是什么:它告诉我会议的再次发生,例如每天从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月3日开始,持续10次

如果字符串表明所有会议都在过去,有人知道如何计算吗?我想要一个select语句,它告诉我重复值是否过去 - true或false

1 个答案:

答案 0 :(得分:2)

我添加了一个字符串('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)