第二次出现特定字符后获取文本

时间:2019-10-22 12:45:37

标签: sql sql-server string tsql

我有一列这样的数据:

firstNameLetter_surname_numericCode

例如:

m_johnson_1234

我需要提取数字代码。我已经尝试使用SUBSTRING函数,但是我得到了:

surname_numericCode

这是我使用的代码:

SET number = substring(t2.code, charindex('_', t2.code, 2) + 1, len(t2.code))  

如何只获取数字代码?

5 个答案:

答案 0 :(得分:1)

两次调用CHARINDEX函数:

SELECT SUBSTRING(
           code,
           NULLIF(CHARINDEX('_', code, NULLIF(CHARINDEX('_', code), 0) + 1), 0) + 1,
           LEN(code)
       )
FROM (VALUES
    ('a_b_c'),
    ('a_b')
) x(code)

答案 1 :(得分:1)

一种方法是在反向字符串中查找第一个_

select col,
       stuff(col, 1, len(col) - charindex('_', reverse(col)) + 1, '') as numericCode
from (values ('firstNameLetter_surname_numericCode')) v(col);

如果数字代码实际上是一个数字-并且没有其他数字以前面的值开头-那么您可以使用patindex()

select col,
       stuff(col, 1, patindex('%[_][0-9]%', col), '') as numericCode
from (values ('firstNameLetter_surname_0000')) v(col);

答案 2 :(得分:1)

为您提供一线服务

ungroup()

答案 3 :(得分:1)

最新答案,只是因为我没有看到提到的PARSENAME()

示例

Select parsename(replace(t2.code,'_','.'),1)
 From  YourTable

答案 4 :(得分:0)

可以将SUBSTR和INSTR函数组合在一起以获取数字代码。

SELECT SUBSTR('m_johnson_1234', INSTR('m_johnson_1234', '_', 1, 2)+1) FROM TABLE; 

对于start_pos参数,请使用INSTR从字符串的开头开始,并找到'_'字符的第二个实例的索引。然后使用它在字符串之后的一个位置开始读取字符串的末尾。

如果您需要结果为数字而不是字符串,则将SUBSTR()包装在TO_NUMBER()函数中。