SQL While循环存在

时间:2018-09-07 00:56:28

标签: sql sql-server

我正在尝试从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

2 个答案:

答案 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|%'