Проблема сопоставления с образцом T-SQL - PullRequest
0 голосов
/ 08 июля 2011

Мне нужно определить, имеет ли данная строка формат 'abcd efg -4', т.е. '% -number'. Мне нужно выделить «4» и увеличить его до «5».

Остальная часть строки может содержать даты и время, например:

abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM

эта строка, например, НЕ соответствует шаблону, т.е. - [число]. Для этой строки вывод из моего SQL должен быть

abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM -1

Если приведено выше, я должен получить:

abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM -2

Число может быть любым числом цифр, т. Е. Строка может быть 'abcd efg -123', и мой T-SQL будет возвращать 'abcd efg -124'

Этот код T-SQL будет встроен в хранимую процедуру. Я знаю, что мог бы реализовать хранимые proc / function .Net и использовать Regex для этого, однако существуют различные проблемы с доступом, которые мне нужно решить, чтобы включить CLR на SQL Server.

Я пробовал следующие шаблоны:

  • '% [] [-]% [0-9]', это работает в большинстве случаев, но где-то помещается в дополнительный пробел и происходит сбой
  • '% [] [-]% [^ az] [^ AZ]% [0-9]', это позволяет пропустить '-4' (как показано в приведенном выше примере), но работает в нескольких случаях, такие
  • '% [] [-] [^ a-z] [^ A-Z]% [0-9]', в одних это опять работает, в других - нет ...

Этот шаблон '- [число]' всегда будет в конце строки, если его нет, код добавит его, как показано в примерах выше.

Я бы хотел шаблон, который работает для ВСЕХ случаев ...

1 Ответ

0 голосов
/ 08 июля 2011

Интересная проблема.Вы действительно понимаете, что это намного сложнее, чем должно быть на самом деле.Если вы правильно нормализуете свою таблицу, чтобы каждый столбец содержал только один фрагмент информации, у вас вообще не было бы проблем.Если это возможно, я настоятельно рекомендую вам нормализовать эти данные.

Если вы не можете нормализовать данные, я бы подошел к этому в обратном направлении.Вы сказали, что искомый номер будет всегда находиться в конце данных.Почему бы не перевернуть строку, не разобрать ее и не собрать обратно.Перевернув строку, вы будете искать «[0-9]% [-]», который гораздо проще найти.

Я поместил ваши тестовые данные в табличную переменную, чтобы я могпроверить код, который я придумал.Вы можете скопировать / вставить это в окно запроса, чтобы увидеть, как оно работает.

Declare @Temp Table(Data VarChar(100))

Insert Into @Temp Values('abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM')
Insert Into @Temp Values('abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM -1')
Insert Into @Temp Values('abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM -2')
Insert Into @Temp Values('abcd efg -123')

Select Case When PatIndex('[0-9]%[-]%', Reverse(Data)) = 1
            Then Left(Data, Len(Data)-CharIndex('-', Reverse(Data))) + '-' +
                 Convert(VarChar(20), 1+Convert(Int, Reverse(Left(Reverse(Data), CharIndex('-', Reverse(Data))-1))))
            Else Data + ' -1'
            End
From   @Temp
...