繁体   English   中英

SQL SPLIT with New Row

[英]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如我所料。

我想,我有一个解决方案给你。 但是,在不同的情况下它可能不起作用。 我已经使用SUBSTRINGCHARINDEXSTRING_SPLITREPLACECAST来实现您想要的答案。 这是我在下面给出的代码=>

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM