尝试提取2个字符之间的数字'|' MS SQL

时间:2018-08-30 13:03:01

标签: sql sql-server

我有一列,需要提取2个管道|之间的数字,示例数据为AAA|12345678|#RRR。我需要获得这个号码12345678

我的代码是:

SELECT SUBSTRING(column_name,CHARINDEX('|',column_name) + 1, CHARINDEX('|',column_name) - CHARINDEX('|',column_name) - 1)
FROM [name].[name].[table_name]

4 个答案:

答案 0 :(得分:1)

假设第二个位置,您可以使用一点XMLParseName()

XML示例

Declare @YourTable table (ID int,column_name varchar(max))
Insert Into @YourTable values
(1,'AAA|12345678|#RRR')


Select ID
      ,SomeValue = Cast('<x>' + replace(column_name,'|','</x><x>')+'</x>' as xml).value('/x[2]','varchar(max)')
 From @YourTable

ParseName()示例

Select ID
      ,SomeValue = parsename(replace(column_name,'|','.'),2)
 From @YourTable

两者都会回来

ID  SomeValue
1   12345678

答案 1 :(得分:1)

使用您自己的代码:

SELECT SUBSTRING(column_name,CHARINDEX('|',column_name) + 1, 
CHARINDEX('|',column_name) - CHARINDEX('|',column_name) - 1)
FROM [name].[name].[table_name]

子字符串的第二部分不正确。应该是:

SELECT SUBSTRING(column_name,CHARINDEX('|',column_name) + 1, 
CHARINDEX('|',column_name, CHARINDEX('|',column_name)))
FROM [name].[name].[table_name]

嵌套的CHARINDEX将查找第二个管道的位置。而SUBSTRING将从第一个管道开始,然后继续到第二个管道

答案 2 :(得分:0)

在SQL Server中,字符串提取通常比较棘手。但是,如果您只有一个数字值并正在寻找它,那么代码并不是那么糟糕:

select patindex('%[0-9]|%', str),
       substring(str, patindex('%|[0-9]%', str), patindex('%[0-9]|%', str) - patindex('%|[0-9]%', str) + 1)
from (values ('AAA|12345678|#RRR')) v(str) 

答案 3 :(得分:0)

我会使用PARSENAME()

select parsename(replace(str, '|', '.'), 2)
from ( values ('AAA|12345678|#RRR')
     ) v(str);