SQL脚本patindex

时间:2010-07-20 06:00:00

标签: sql-server tsql patindex

我认为我的脚本中有一些语法错误,但无法弄清楚在哪里。

我想从一个单元格的右边开始选择一对()之间的整数?原因是,可能有另一对包含字符的括号

如果由于某种原因某些记录没有关闭括号怎么办?

e.g。

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 个答案:

答案 0 :(得分:2)

所以,你需要抓住字符串末尾的最后一组开括号和右括号之间的内容,对吗?

首先,从字符串的末尾找到第一个开口括号。我会使用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

我已经打破了我的答案,所以你可以看到我如何解决这些问题 - 一次做一次,随着时间检查结果,并且更容易理解。