我想我的脚本中有一些语法错误,但是我不知道在哪里。
我想选择从单元格右侧开始的一对()之间的整数。原因是,可能存在另一对包含字符的括号
如果某些记录由于某种原因没有右括号,该怎么办呢?
例如:
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)
我一直在操纵它,使它不提取')',但无法获得预期的结果。
发布于 2010-07-20 16:44:30
所以,你需要抓取字符串末尾的最后一组左括号和右括号之间的内容,对吧?
首先,找到字符串末尾的第一个左方括号。我将使用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我已经分解了我的答案,所以你可以看到我是如何处理这样的问题的--一次做一点,在进行的过程中检查结果,这样更容易理解。
https://stackoverflow.com/questions/3287387
复制相似问题