0

我有一个字符串:

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

4

2 回答 2

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来指定开始的位置。为了清楚起见,由于开始位置需要使用几次,我将它移到 anAPPLY中,这样我就可以重用别名,而不是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)
于 2016-11-04T09:59:47.063 回答
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;
于 2016-11-04T09:42:25.160 回答