[英]SQL SPLIT with New Row
我有一个 MS Sql 数据库,其中有以下数据:
ID | ORD_No | Date | User | Note
-----+--------------+------------+------------+---------------
1 | 18/UT00120/ZS| | |---- Saved 10/10/2020 14:08 by John Snow, rest of the note
----Saved on 11/11/2020 13:09 by Mike Kowalsky, rest of the
note ---- Saved on 12/11/2020 11:00 by Barbara Smith, rest of the note
从那我想创建以下output:
ID | ORD_No | Date | User | Note
-----+--------------+------------+----------------+---------------
1 | 18/UT00120/ZS| 10/10/2020 | John Snow | rest of the note
-----+--------------+------------+----------------+---------------
2 | 18/UT00120/ZS| 11/11/2020 | Mike Kowalsky | rest of the note
-----+--------------+------------+----------------+---------------
3 | 18/UT00120/ZS| 12/11/2020 | Barbara Smith | rest of the note
请告知我如何才能达到所需的 output。
谢谢!
SQL 服务器没有很好的字符串处理功能。 你可以这样做,但它相当痛苦——而且对于音符可能看起来的所有变化都不会灵活。
一个大问题是内置的string_split()
function 不采用多字符分隔符。 下面选择一个不太可能出现在notes
中的字符。
此外,前导前缀并不一致——有一个“开”,有时没有。 因此,这不会尝试提取“字符串的其余部分”。 它留在前缀中。 您可以使用额外的字符串操作来处理这个问题,但我怀疑真正的问题更复杂。
无论如何,这非常接近您想要的:
select t.id, t.ord_no, trim(s.value), s2.value as date
from t cross apply
string_split(replace(note, '----', '~'), '~') s cross apply
(select top (1) s2.value
from string_split(s.value, ' ') s2
where try_convert(date, s2.value, 101) >= '2000-01-01'
) s2;
这是一个 db<>fiddle。
请注意,之所以使用日期不等式,是因为select try_convert(date, '')
返回'1900-01-01'
而不是NULL
如我所料。
我想,我有一个解决方案给你。 但是,在不同的情况下它可能不起作用。 我已经使用SUBSTRING
、 CHARINDEX
、 STRING_SPLIT
、 REPLACE
和CAST
来实现您想要的答案。 这是我在下面给出的代码=>
DECLARE @MyTable Table (ID INT, ORD_No VARCHAR(100),Note VARCHAR(300));
INSERT INTO @MyTable VALUES(1,'18/UT00120/ZS','Saved on 10/10/2020 14:08 by John Snow, rest of the note');
INSERT INTO @MyTable VALUES(2,'18/UT00120/ZS','Saved on 11/11/2020 07:08 by Mike Kowalsky, rest of the note');
INSERT INTO @MyTable VALUES(3,'18/UT00120/ZS','Saved on 12/11/2020 16:08 by Barbara Smith, rest of the note');
Select ID,ORD_No ,CAST(substring(Note,9,17) AS DATE) [Date],
(SELECT top 1 value FROM STRING_SPLIT(SUBSTRING(Note,29,CHARINDEX(',',Note,0)),',')) AS [USER],
RIGHT(REPLACE(SUBSTRING(Note, CHARINDEX(',', Note), LEN(Note)), '', ''), len(REPLACE(SUBSTRING(Note, CHARINDEX(',', Note), LEN(Note)), '', ''))-1) AS NOTE
FROM @MyTable
注意:仅当您的Note
列数据始终与您在问题中提供的格式相同时,此代码才有效。 还要检查db-fiddle Link 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.