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>
。
我希望将一串带分隔符的日期拆分成它们各自的值,并将它们放在结果的列中 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>
。