我正在尝试从SQL中的一个单元格获取日期列表。这些日期全部在SQL "....d|43460)())(0||1(d|42534)())(0||2(d|40910)())(0||3(d|41855)..."
中的一个单元格中
我设法编写了一个查询,获取了第一个日期
SELECT Substring (clndr_data , CHARINDEX('d|', clndr_data)+2, 5)
FROM [x].[dbo].[CALENDAR]
where clndr_id = '954'
我需要获取所有其他日期,因此我假设必须使用While或Loop来获取“ d |”之后的所有日期?如果有人可以帮助,将不胜感激。
必需的输出(这应该是一个列表,但是我在这里不能显示出来):
Number Date
43460 26/12/2018
42534 13/06/2016
40910 02/01/2012
答案 0 :(得分:0)
DECLARE @clndr_data varchar(MAX) = 'd|43460)())(0||1(d|42534)())(0||2(d|40910)())(0||3(d|41855)' DECLARE @walker int = 0 DECLARE @holder varchar(MAX) = @clndr_data DECLARE @date varchar(5) DECLARE @tempTb table([value] varchar(50)) WHILE CHARINDEX('d|', @holder) > 0 BEGIN SET @walker = CHARINDEX('d|', @holder) + 2 SET @date = (SELECT SUBSTRING(@holder, @walker, 5)) INSERT INTO @tempTb VALUES (@date) SET @holder = SUBSTRING(@holder, @walker + 5, LEN(@holder)) END SELECT * FROM @tempTb
只需将>>> list(filter(lambda i: i[0][:2]==i[1][:2]],tuples))
[[('2018', 'Q1', 'Dept1'), ('2018', 'Q1', 'Dept2')], [('2018', 'Q2', 'Dept1'), ('2018', 'Q2', 'Dept2')]]
>>>
替换为实际的@clndr_data
列即可。不要忘记将clndr_data
变量设置为此列的值。
@holder
DECLARE @walker int = 0 DECLARE @holder varchar(MAX) DECLARE @date varchar(5) DECLARE @tempTb table([value] varchar(50)) SET @holder = (SELECT clndr_data FROM [x].[dbo].[CALENDAR] WHERE clndr_id = '954') WHILE CHARINDEX('d|', @holder) > 0 BEGIN SET @walker = CHARINDEX('d|', @holder) + 2 SET @date = (SELECT SUBSTRING(@holder, @walker, 5)) INSERT INTO @tempTb VALUES (@date) SET @holder = SUBSTRING(@holder, @walker + 5, LEN(@holder)) END SELECT * FROM @tempTb
答案 1 :(得分:0)
您可以将clndr_data
视为定界字符串,并使用定界字符串拆分器将其拆分为列表中的多个项目。在这里,我使用")("
作为分隔符
我在这里使用http://www.sqlservercentral.com/articles/Tally+Table/72993/的Jeff Moden的DelimitedSplit8K()
注意:您需要先创建函数
SELECT clndr_data, right(Item, 5) as Number
FROM [x].[dbo].[CALENDAR]
CROSS APPLY dbo.DelimitedSplit8K(clndr_data, ')(')
where clndr_id = '954'
and Item like '%d|%'