【问题标题】:Double substring双子串
【发布时间】:2021-12-21 08:48:56
【问题描述】:

在我的表中,我有一列包含两个 ID:

示例:

Comment
Internal message ID: 7878 External message ID: 788CBNCGD9_3_5_87BFHJD
Internal message ID: 90278 External message ID: 788H2692029_3_5_8890ZG

我想得到两列:内部 ID 和外部 ID

Internal ID External ID
7878 788CBNCGD9_3_5_87BFHJD
90278 788H2692029_3_5_8890ZG

我一直在考虑使用子字符串,但我不知道如何。

有人可以帮我吗?

【问题讨论】:

  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。

标签: sql sql-server substring


【解决方案1】:

老实说,我建议从源头修复您的设计,而不是将本质上是分隔的数据插入到您想要使用的数据库中。

不过,在我们拥有的示例数据上,您可以通过 SQL Server 的基本字符串操作来实现这一点:

SELECT SUBSTRING(V.Comment,CI1.I,CI2.I-CI1.I),
       SUBSTRING(V.Comment,CI3.I, ISNULL(NULLIF(CI4.I,0),LEN(V.Comment)+1)  - CI3.I)
FROM (VALUES('Internal message ID: 7878 External message ID: 788CBNCGD9_3_5_87BFHJD'),
            ('Internal message ID: 90278 External message ID: 788H2692029_3_5_8890ZG'))V(Comment)
     CROSS APPLY (VALUES(CHARINDEX(':',V.Comment)+2))CI1(I)
     CROSS APPLY (VALUES(CHARINDEX(' ',V.Comment,CI1.I)))CI2(I)
     CROSS APPLY (VALUES(CHARINDEX(':',V.Comment,CI2.I)+2))CI3(I)
     CROSS APPLY (VALUES(CHARINDEX(' ',V.Comment,CI3.I)))CI4(I);

【讨论】:

  • NULLIF(..., 0) 在每个CHARINDEX 上都是个好主意,以防万一找不到它
  • @Charlieface 我确实考虑过,但有 2 个例子,我觉得我缺乏信息表明数据不符合数据可以遵循不同的格式。
  • IMO 明智的做法是总是 这样做,因为如果基表中有任何内容,即使它们是使用WHERE 或连接过滤的,通常函数计算被推送到谓词过滤之前,因此可能会导致错误。参见例如stackoverflow.com/a/67259538/14868997
  • 恐怕我还记得 if 是一个场景,@Charlieface,然后需要更多示例。
猜你喜欢
  • 2016-10-03
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2014-09-20
  • 2021-12-19
  • 2021-06-20
  • 1970-01-01
相关资源
最近更新 更多