Patindex和Charindex给了我更多的东西,而不是我要求的

时间:2016-11-04 09:34:51

标签: sql substring charindex patindex

我有一个字符串:

ALIS Predictions Y12 2016-17 Test Based Predictions

我希望在Y之后返回数字并使用以下SQL(作为示例):

SELECT SUBSTRING('ALIS Predictions Y12 2016-17 Test Based Predictions',
                 PATINDEX('%[0-9]%',
                          'ALIS Predictions Y12 2016-17 Test Based Predictions'),
                 CHARINDEX(' ',
                           'ALIS Predictions Y12 2016-17 Test Based Predictions'
                          )
                )

但我得到的结果是:

12 20

当然最后的CHARINDEX应该给我表达直到第一个空格?我怎样才能调整它以便我只获得Y之后的数字?

2 个答案:

答案 0 :(得分:0)

问题是,第三个参数是查看字符串中的第一个空间,而不是" Y"之后的空格。这是另一种方式:

SELECT LEFT(numstr, CHARINDEX(' ', x.str) - 1)
FROM (SELECT 'ALIS Predictions Y12 2016-17 Test Based Predictions' as str
     ) x OUTER APPLY
     (SELECT STUFF(x.str, 1, PATINDEX('%[0-9]%', x.str) - 1, '') as numstr
     ) y;

答案 1 :(得分:0)

只需评估其上的每个部分,看看发生了什么:

SELECT PATINDEX('%[0-9]%', 'ALIS Predictions Y12 2016-17 Test Based Predictions'),
       CHARINDEX(' ', 'ALIS Predictions Y12 2016-17 Test Based Predictions')

分别给你19和5,所以你告诉子字符串函数从字符19开始,并接下来的5个字符

我认为你真正想做的是找到起始字符串后面的第一个空格,所以你需要将第三个参数传递给CHARINDEX以指定开始的位置。为了清楚起见,由于起始位置需要使用几次,我已将其移到APPLY中,因此我可以重复使用别名,而不是多次重复PATINDEX表达式

SELECT  SUBSTRING(t.Value, p.StartIndex, CHARINDEX(' ', t.Value, p.StartIndex) - p.StartIndex)
FROM    (SELECT 'ALIS Predictions Y12 2016-17 Test Based Predictions') AS t (Value)
        CROSS APPLY (SELECT PATINDEX('%Y[0-9]%', t.Value) + 1) AS p (StartIndex)