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

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

Другие вопросы по тегам