我正在试图弄清楚如何从一个字符串中提取一个数字(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))
谢谢!
答案 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)))