我有一个字符串:
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;