Patindex 和 Charindex 给了我比我要求的更多的东西
Patindex and Charindex give me more than what i'm Asking for
我有一个字符串:
ALIS Predictions Y12 2016-17 Test Based Predictions
我想要 return 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 应该给我表达式直到第一个 space?我怎样才能调整它以便我只得到 Y 之后的数字?
问题是第三个参数是在看字符串中的第一个 space,而不是"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;
只需单独评估每个部分,看看发生了什么:
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 个字符
我认为你真正想做的是找到开始字符串后的第一个 space,所以你需要将第三个参数传递给 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)
我有一个字符串:
ALIS Predictions Y12 2016-17 Test Based Predictions
我想要 return 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 应该给我表达式直到第一个 space?我怎样才能调整它以便我只得到 Y 之后的数字?
问题是第三个参数是在看字符串中的第一个 space,而不是"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;
只需单独评估每个部分,看看发生了什么:
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 个字符
我认为你真正想做的是找到开始字符串后的第一个 space,所以你需要将第三个参数传递给 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)