SQL - 拆分字符串多个值,多个值

SQL - Split string multiple values, multiple values

我希望将一串带分隔符的日期拆分成它们各自的值,并将它们放在结果的列中 table。我在以下方面取得了一些成功,但对于我的特定应用来说还不够 SQL - Split string to columns by multiple delimiters

String (from & to dates)
tblTempDates.tmpString
2019-2-11--2019-2-15,2019-2-20--2019-2-20,2019-2-23--2019-2-23,2019-3-19--2019-3-24

Delimiters
-- seperates from & to
, new record

Output required
tblTempDates2
dtFrom        dtTo
2019-02-11    2019-02-15
2019-02-20    2019-02-20
2019-02-23    2019-02-23
2019-02-19    2019-03-24

非常感谢:-)

可以使用while语句拆分csv,

    declare @a table(datefromto varchar(500))

    declare @b table(fromdate varchar(500),todate varchar(500))

    insert into @a values ('2019-2-11--2019-2-15,2019-2-20--2019-2-20,2019-2-23--2019-2-23,2019-3-19--2019-3-24');

    declare @datefromto varchar(500) = (select max(datefromto) from @a)

    declare @datesplit int
    set @datesplit= (SELECT charindex(',',@datefromto))



    WHILE (SELECT charindex(',',@datefromto) FROM @a) <> 0
    BEGIN  



       insert into @b select Left(left(@datefromto,@datesplit),charindex('--',@datefromto)-1) ,
       Right(left(@datefromto,@datesplit-1),charindex('--',@datefromto)-1) from @a


       set @datesplit= (SELECT charindex(',',@datefromto))
       set @datefromto= right(@datefromto,len(@datefromto)-@datesplit)

    END  
       insert into @b select Left(left(@datefromto,@datesplit),charindex('--',@datefromto)-1) ,
       Right(left(@datefromto,@datesplit-1),charindex('--',@datefromto)-1) from @a

    select * from @b

这是使用 STRING_SPLIT 执行此操作的一种好方法,如果您的 SQL 服务器版本支持它:

SELECT
    LEFT(value, CHARINDEX('--', value) - 1) AS dtFrom,
    SUBSTRING(value, CHARINDEX('--', value) + 2, 20) AS dtTo
FROM
(
    SELECT STRING_SPLIT(input, ',')
    FROM yourTable
) t;

此方法首先使用 STRING_SPLIT 通过逗号将每个 from/to 日期子字符串拆分为单独的行。然后,它使用基本字符串函数来隔离开始日期和结束日期。

对于 STRING_SPLIT()(或 OPENJSON)之前的版本,我建议采用这种方法:

DECLARE @tbl TABLE(ID INT IDENTITY, YourString VARCHAR(1000));
INSERT INTO @tbl VALUES('2019-2-11--2019-2-15,2019-2-20--2019-2-20,2019-2-23--2019-2-23,2019-3-19--2019-3-24');

WITH Casted AS
(
    SELECT *
         , CAST('<x><y>' + REPLACE(REPLACE(YourString,'--','</y><y>'),',','</y></x><x><y>') + '</y></x>' AS XML) AsXml
    FROM @tbl 
)
SELECT  ID 
       ,x.value('y[1]','date') AS Date1
       ,x.value('y[2]','date') AS Date2
FROM Casted
CROSS APPLY AsXml.nodes('/x') A(x);

简而言之:

一些字符串替换将您的 多级 CSV 转换为这样的 XML

<x>
  <y>2019-2-11</y>
  <y>2019-2-15</y>
</x>
<x>
  <y>2019-2-20</y>
  <y>2019-2-20</y>
</x>
<x>
  <y>2019-2-23</y>
  <y>2019-2-23</y>
</x>
<x>
  <y>2019-3-19</y>
  <y>2019-3-24</y>
</x>

然后我们可以使用 .nodes() 将所有重复的 <x> 导出为 table。然后我们使用 .value() 按位置获取 <y>