Patindex SQL Script
Я думаю, что у меня есть какая-то синтаксическая ошибка в моем скрипте, но я не могу понять, где.
Я хочу выбрать целое число, которое находится между парой (), начиная справа от ячейки? Причина в том, что может быть другая пара скобок, содержащих символы
и что, если некоторые записи по какой-то причине закрываются без скобок..
например
Period | ProgrammeName |
Jan | ABC (Children) (30) |
Feb | Helloworld (20T (20) |
результат: 30 20
select
Period,
ProgrammeName,
substring(ProgrammeName,(len(ProgrammeName) - (patindex('%(%', Reverse(ProgrammeName)))+2),(len(ProgrammeName)-1))
from
Table
но это только отображает
30)
20)
Я манипулировал им, чтобы он не извлекал ')', но не могу получить ожидаемых результатов.
1 ответ
Итак, вам нужно взять что-нибудь между последним набором открытых и закрывающих скобок в конце строки, верно?
Прежде всего, найдите первую открывающую скобку с конца строки. Я бы использовал CHARINDEX, так как вы просто ищете один символ; вам не нужно использовать сопоставление с образцом.
SELECT LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName)) FROM Table
Затем найдите первую закрывающую скобку в конце строки:
SELECT LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName)) FROM Table
Затем сложите их вместе. Чтобы использовать SUBSTRING, вам нужна позиция первого символа, затем длина строки, которую вы хотите, поэтому вам нужен первый результат (позиция '('), а затем второй результат минус первый результат, чтобы получить длина брекета в скобках, как отправная точка:
SELECT (LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName))) - (LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName))) FROM Table
Вам также нужно немного повозиться, чтобы извлечь часть между скобками, оставив скобки в покое. Это объясняется в комментариях к последнему примеру, где последнее выражение должно выполнять ту работу, которую вы хотите:
SELECT
-- Position of first bracket
LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName)),
-- Position of second bracket
LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName)),
-- Position of second bracket minus position of first bracket gives length
(LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName))) - (LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName))),
-- If we want to extract the bit between the brackets, we need to start from the bracket position
-- plus one character, and knock one off the length, to avoid grabbing the closing bracket.
SUBSTRING(ProgrammeName, 1 + LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName)), (LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName))) - (LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName))) - 1)
FROM
Table
Я разбил свой ответ так, чтобы вы могли видеть, как я подхожу к таким проблемам - делайте их по одному, проверяя результаты по мере продвижения, и вам легче разобраться.