Patindex SQL Script - PullRequest
       15

Patindex SQL Script

0 голосов
/ 20 июля 2010

Я думаю, что у меня есть какая-то синтаксическая ошибка в моем скрипте, но я не могу понять, где.

Я хочу выбрать целое число, которое находится между парой (), начинающейся справа от ячейки? Причина в том, что может быть другая пара скобок, содержащих символы

а что если некоторые записи по какой-то причине закрыты скобками ..

например.

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 Ответ

2 голосов
/ 20 июля 2010

Итак, вам нужно взять что-нибудь между последним набором открытых и закрывающих скобок в конце строки, верно?

Прежде всего, найдите первую открывающую скобку с конца строки. Я бы использовал 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

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

...