Sql server SQL脚本patindex

Sql server SQL脚本patindex,sql-server,tsql,patindex,Sql Server,Tsql,Patindex,我想我的脚本中有一些语法错误,但不知道在哪里 我想选择从单元格右侧开始的一对之间的整数?原因是,可能还有一对括号包含字符 如果由于某种原因,某些记录不带括号怎么办 e、 g 结果:3020 select Period, ProgrammeName, substring(ProgrammeName,(len(ProgrammeName) - (patindex('%(%', Reverse(ProgrammeName)))+2),(len(ProgrammeName)-1

我想我的脚本中有一些语法错误,但不知道在哪里

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

如果由于某种原因,某些记录不带括号怎么办

e、 g

结果:3020

select
    Period,
    ProgrammeName,
     substring(ProgrammeName,(len(ProgrammeName) - (patindex('%(%', Reverse(ProgrammeName)))+2),(len(ProgrammeName)-1))
 from
    Table
但它只显示 30 二十


我一直在操纵它,使它无法提取,但无法得到预期的结果。

因此,您需要抓住字符串末尾最后一组开括号和闭括号之间的任何内容,对吗

首先,从字符串末端找到第一个开口括号。我会使用CHARINDEX,因为你只是在寻找一个角色;您不需要使用模式匹配

SELECT LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName)) FROM Table
然后,从字符串末尾找到第一个结束括号:

SELECT LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName)) FROM Table
然后,把它们放在一起。要使用子字符串,您需要第一个字符的位置,然后是所需字符串的长度,因此您需要第一个结果-的位置,然后是第二个结果减去第一个结果,以获得带括号位的长度,作为起点:

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
我已经把我的答案分解了,这样你就可以看到我是如何处理这些问题的——一次做一点,边做边检查结果,这样你就更容易动脑了

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