我有一个字符串:
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之后的数字?
答案 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)