我有一列,需要提取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]
答案 0 :(得分:1)
假设第二个位置,您可以使用一点XML
或ParseName()
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);