Sql 选择管道分隔值
我有一个从分隔字符串中选择单个值的场景 例如:Sql 选择管道分隔值,sql,sql-server,split,Sql,Sql Server,Split,我有一个从分隔字符串中选择单个值的场景 例如: declare @Test varchar(100) = 'ABC|DEF|GHI' 由于数据库是SQL Server 2008版本,我无法使用拆分函数 正在寻找分割和分别选择每个值的最佳方法。此注释太长。最好的方法是不使用分隔值。相反,您可以使用表变量: declare @Test table (val varchar(100)); insert into @Test(val) values ('ABC', 'DEF', 'GHI')
declare @Test varchar(100) = 'ABC|DEF|GHI'
由于数据库是SQL Server 2008版本,我无法使用拆分函数
正在寻找分割和分别选择每个值的最佳方法。此注释太长。最好的方法是不使用分隔值。相反,您可以使用表变量:
declare @Test table (val varchar(100));
insert into @Test(val)
values ('ABC', 'DEF', 'GHI');
瞧。没问题。您可以使用CharIndex()查找分隔符,然后使用SubString()在它们之间进行抓取:
Declare @Test varchar(100) = 'ABC|DEF|GHI'
Declare @d1 Int = CharIndex('|',@Test,1)
Declare @d2 Int = CharIndex('|',@Test,@d1+1)
Select
Substring(@Test,1,@d1-1) As f1,
Substring(@Test,@d1+1,@d2-@d1-1) As f2,
Substring(@Test,@d2+1,len(@Test)-@d2) As f3
结果:
f1 f2 f3
ABC DEF GHI
您可以在SQL server中创建自己的自定义函数来拆分字符串。您可以使用下面的函数来实现此
Create FUNCTION SplitString(@str VARCHAR(8000), @delimiter Varchar(1))
RETURNS @Temp Table ( item varchar(100))
as Begin
Declare @i as int=0
Declare @j as int=0
Set @j = (Len(@str) - len(REPLACE(@str,@delimiter,'')))
While @i < = @j
Begin
if @i < @j
Begin
Insert into @Temp
Values(SUBSTRING(@str,1,Charindex(@delimiter,@str,1)-1))
set @str = right(@str,(len(@str)- Charindex(@delimiter,@str,1)))
End
Else
Begin
Insert into @Temp Values(@str)
End
Set @i = @i + 1
End
return;
End
go
select * from dbo.SplitString('ABC|DEF|GHI', '|')
创建函数SplitString(@str VARCHAR(8000),@delimiter VARCHAR(1))
返回临时表(项目varchar(100))
作为开始
将@i声明为int=0
将@j声明为int=0
Set@j=(Len(@str)-Len(REPLACE(@str,@delimiter'))
而@i<=@j
开始
如果@i<@j
开始
插入到@Temp中
值(子字符串(@str,1,Charindex(@delimiter,@str,1)-1))
设置@str=right(@str,(len(@str)-Charindex(@delimiter,@str,1)))
终点
其他的
开始
插入@Temp值(@str)
终点
设置@i=@i+1
终点
返回;
终点
去
从dbo.SplitString('ABC | DEF | GHI','|')中选择*
我从源代码中获取分隔值,源代码不受编辑控制