Использование PATINDEX для поиска времени в тексте в SQL Server с использованием нескольких форматов - PullRequest
1 голос
/ 05 июня 2019

Мне нужно использовать регулярное выражение, которое возвращает время в формате 12:43 И 1:33, я попробовал следующее, и каждое из них возвращает желаемые результаты, как я могу объединить оба, чтобы SQL мог вернуть либо первое ИЛИ второй:

set @reg = '[0-9]:[0-5][0-9]'
set @reg = '[0-1][0-2]:[0-5][0-9]'

Что я пробовал:

Declare @reg nvarchar(100) 
set @reg = '[0-9]:[0-5][0-9]' 
--set @reg = '[0-1][0-2]:[0-5][0-9]' 

select remarks, 
       substring(remarks,PATINDEX('%' + @reg + '%',remarks) ,5), len(PATINDEX('%' + @reg + '%',remarks)) 
from infraction 
where remarks like '%' + @reg + '%'

1 Ответ

3 голосов
/ 05 июня 2019

Вы захотите найти любую строку, в которой существует какой-либо шаблон, а затем применить соответствующий ограниченный SQL «регулярное выражение» в зависимости от того, какой шаблон соответствует.HH:MM один является более ограничивающим, чем H:MM, поэтому мы используем его для проверки.

CREATE TABLE #infraction (
  Comment VARCHAR(100)
)

INSERT INTO #infraction VALUES ('time of 12:35 incident')
INSERT INTO #infraction VALUES ('time of 1:34 incident');

DECLARE @reg NVARCHAR(100) = '[0-9]:[0-5][0-9]'
DECLARE @reg2 NVARCHAR(100) = '[0-1][0-2]:[0-5][0-9]'

SELECT
    Comment,
    IIF(PATINDEX('%' + @reg2 + '%', Comment) = 0,
        SUBSTRING(Comment, PATINDEX('%' + @reg + '%', Comment), 4),
        SUBSTRING(Comment, PATINDEX('%' + @reg2 + '%', Comment), 5)
    )
FROM
    #infraction 
WHERE
    Comment LIKE '%' + @reg + '%'
    or
    Comment LIKE '%' + @reg2 + '%';

Возвращает:

12:35
1:34

SQL Fiddle

...