从字符串的一部分中提取数字

时间:2014-03-27 10:40:14

标签: sql-server tsql

我正在试图弄清楚如何从一个字符串中提取一个数字(nvarchar,我想我应该说),只有一个复杂,我只需要字符串右侧的数字。这可能没有意义所以这是一个例子,如果字符串是12857 ABC 456那么我只想要456部分。

直到现在,这些字符串刚刚采用这种格式ABC 456,但现在他们已经开始使用数字作为前缀,这导致我现有的代码失败。这就是我现在正在使用的,它将在第一个示例中返回12857456

CONVERT (int, LEFT (SUBSTRING([FIELD], PATINDEX('%[0-9.-]%', [FIELD]), 8000), PATINDEX('%[^0-9.-]%', SUBSTRING([FIELD], PATINDEX('%[0-9.-]%',[FIELD]), 8000) + 'X') - 1))

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您的值固定大小,请使用RIGHT字符串函数。 如果新的数字前缀是固定大小,请使用LEFT去除它并使用旧代码完成剩下的工作。

如果没有固定字符串或数字序列,请使用PATINDEX删除新的前缀数字并应用旧代码。

答案 1 :(得分:1)

这应该有效:

SELECT CONVERT(INT, REVERSE(SUBSTRING(REVERSE([field]),1,CHARINDEX(' ',REVERSE(@field))-1)))

答案 2 :(得分:1)

我在第一个LEFT功能之前和之后添加了2个反向功能。

REVERSE函数只是从右向左读取文本而不是从左到右的SQL默认值,因此THE String" 12857 ABC 456"会阅读" 654 CBA 75821"。

您编写的查询可以处理从左侧读取的内容,就像您获得最后一部分654 C一样。

然后我不得不将查询的最后一部分改为-1到-2然后得到值654

然后LEFT函数之前的REVERSE函数会将数字654更改回其默认值456.

   CONVERT(int,REVERSE(LEFT(reverse(SUBSTRING([Name], PATINDEX('%[0-9.-]%', [Name]), 8000)), PATINDEX('%[^0-9.-]%', SUBSTRING([Name], PATINDEX('%[0-9.-]%',[Name]), 8000) + 'X') - 2)))