Patindex和Charindex给我的不仅仅是我所要求的



我有一个字符串:

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之后的数字?

单独评估每个部分,看看发生了什么:

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)

问题是第三个参数查看的是字符串中的第一个空格,而不是"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;

相关内容

  • 没有找到相关文章

最新更新