2010-07-20 61 views
0

我觉得我有一些语法错误在我的剧本,但不能揣摩出。SQL脚本PATINDEX

我想选择一对(介于从单元格右侧begining的整数)?原因是,有可能是另一对包含字符

,以及如果有的记录是W/O由于某种原因关闭括号..

例如支架

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)

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

回答

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 

我已经打破了我的答案,所以你可以看到我如何处理这些问题 - 一次只做一点,随着时间的推移检查结果,并且更容易让你头脑发热。

+0

谢谢!它有助于! – marilyn 2010-07-22 07:08:29