首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL脚本patindex

SQL脚本patindex
EN

Stack Overflow用户
提问于 2010-07-20 14:00:00
回答 1查看 1.1K关注 0票数 0

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

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

如果某些记录由于某种原因没有右括号,该怎么办呢?

例如:

代码语言:javascript
复制
Period | ProgrammeName             |  
Jan    | ABC (Children) (30)       |  
Feb    | Helloworld (20T (20)      |  

结果: 30 20

代码语言:javascript
复制
select
    Period,
    ProgrammeName,
     substring(ProgrammeName,(len(ProgrammeName) - (patindex('%(%', Reverse(ProgrammeName)))+2),(len(ProgrammeName)-1))
 from
    Table

但它只显示

30)

20)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-20 16:44:30

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

首先,找到字符串末尾的第一个左方括号。我将使用CHARINDEX,因为您只需要查找单个字符;您不需要使用模式匹配。

代码语言:javascript
复制
SELECT LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName)) FROM Table

然后,找到字符串末尾的第一个结束括号:

代码语言:javascript
复制
SELECT LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName)) FROM Table

然后,把它们放在一起。要使用SUBSTRING,您需要第一个字符的位置,然后是您想要的字符串的长度,因此您需要第一个结果( '(')的位置,然后是第二个结果减去第一个结果,以获得带括号的位的长度,作为起点:

代码语言:javascript
复制
SELECT (LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName))) - (LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName))) FROM Table

您还需要做一些工作来提取括号之间的部分,而不是括号。在最后一个示例的注释中解释了这一点,其中最后一个表达式应该执行您想要的工作:

代码语言:javascript
复制
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

我已经分解了我的答案,所以你可以看到我是如何处理这样的问题的--一次做一点,在进行的过程中检查结果,这样更容易理解。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3287387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档