如何找到始终由确切数量的字符类型组成的子字符串?

时间:2019-04-29 09:28:14

标签: sql sql-server database string substring

我在表中有一列想要提取一个子字符串,因此我可以将其用作与另一个表的联接。

但是我有一个问题。子字符串并不总是在相同的位置或前面带有相同的字符。

例如以下内容:

SA 2019M05 7022b000003CDMmAAO - SA20190323 - 2019-03-23 09:20:00 Europe/Amsterdam

我只需要:

7022b000003CDMmAAO

我尝试将SUBSTRINGCHARINDEX结合使用,并且可以正常工作。 但是,我不想一直依赖以70开头的子字符串。

此外,代码并不总是位于-的前面。一致的一部分是代码的编写方式。它始终由以下特定顺序的数字和字母组成:0000a000000aaaaaaa

SELECT 
CASE WHEN t.[jobName] LIKE '%70%' THEN SUBSTRING(t.[jobName],CHARINDEX('70',t.[jobName]),+18) ELSE NULL END AS [Code]
FROM table  t

那么我有什么方法可以找到由0000a000000aaaaaaa型字符组成的子字符串?

3 个答案:

答案 0 :(得分:2)

感谢@Gserg patindex可以正常工作:

SELECT 
 CASE WHEN PATINDEX('%[0-9][0-9][0-9][0-9][a-z][0-9][0-9][0-9][0-9][0-9][0-9][a-z]%',t.[jobName]) = 0 THEN NULL 
      ELSE SUBSTRING(t.[jobName],PATINDEX('%[0-9][0-9][0-9][0-9][a-z][0-9][0-9][0-9][0-9][0-9][0-9][a-z]%',t.[jobName]),+18) END AS [Code]
FROM table t

我刚刚使用了前12个字符,因为我发现最后一部分可能有所不同。加上时的情况,所以我只显示添加代码的作业名称。它看起来不漂亮,但是可以完成工作。

答案 1 :(得分:1)

另一种可能的方法是拆分文本数据并进行必要的检查。使用PATINDEX()SUBSTRING()是一种可行的解决方案,但是这里的一个优点是您可以分析分割文本的每个部分。对于SQL Server 2016+,您可以使用STRING_SPLIT()函数拆分值。

输入:

CREATE TABLE #Data (
   JobName varchar(100)
)
INSERT INTO #Data
   (JobName)
VALUES
   ('SA 2019M05 7022b000003CDMmAAO - SA20190323 - 2019-03-23 09:20:00 Europe/Amsterdam'),
   ('Randombla2019M04 7033v000000G2ZRBB0 - Randombla20190412 - 2019-04-17 09:40:00 Europe/Amsterdam'),
   ('AnotherRandom170419 7055v000000V3a9BB0 - NB-AnotherRandom - 2019-04-17 09:51:51 Europe/Amsterdam')

声明:

SELECT s.[value] AS [Code]
FROM #Data d
OUTER APPLY 
   ( 
   SELECT [value]
   FROM STRING_SPLIT(d.JobName, ' ')
   WHERE PATINDEX('%[0-9][0-9][0-9][0-9][a-z][0-9][0-9][0-9][0-9][0-9][0-9][a-z][a-z][a-z][a-z][a-z][a-z][a-z]%', [value]) > 0
   ) s

输出:

------------------
Code
------------------
7022b000003CDMmAAO
NULL
NULL

答案 2 :(得分:1)

  

我在表中有一列想要提取一个子字符串,因此我可以将其用作与另一个表的联接。

对于JOIN,您不必提取值。为此,您可以使用LIKE

SELECT . . .
FROM t JOIN
     anothertable t2
     ON t.jobName LIKE '% ' + t2.col + ' %'