Как мне найти подстроку, которая всегда состоит из точного числа типов символов? - PullRequest
3 голосов
/ 29 апреля 2019

У меня есть столбец в таблице, где я хотел бы извлечь подстроку, чтобы я мог использовать ее как объединение с другой таблицей.

Однако у меня возникла проблема.Подстрока не всегда находится в одном месте или ей предшествует один и тот же символ.

Например, из следующего:

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

Мне нужно только:

7022b000003CDMmAAO

Я пытался использовать SUBSTRING в сочетании с CHARINDEX иэто работает. Однако я не хочу зависеть от подстроки, всегда начинающейся с 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 ]

2 голосов
/ 29 апреля 2019

Спасибо @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 голос
/ 29 апреля 2019

У меня есть столбец в таблице, где я хотел бы извлечь подстроку, чтобы я мог использовать ее как объединение с другой таблицей.

Для JOIN выне нужно извлекать значение.Вы можете использовать LIKE для этой цели:

SELECT . . .
FROM t JOIN
     anothertable t2
     ON t.jobName LIKE '% ' + t2.col + ' %'
1 голос
/ 29 апреля 2019

Другой возможный подход - разделить ваши текстовые данные и сделать необходимые проверки. Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...