选择管道定界值

时间:2019-02-14 22:29:53

标签: sql sql-server split

我有一种方案可以从定界字符串中选择单个值。

示例:

declare @Test varchar(100) = 'ABC|DEF|GHI'

由于数据库为SQL Server 2008版本,因此无法使用拆分功能。

寻找最佳的方式来分别分割和选择每个值。

3 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:0)

您可以在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', '|')

答案 2 :(得分:-1)

这个评论太长了。最好的方法是不使用定界值。相反,您可以使用表变量:

declare @Test table (val varchar(100));

insert into @Test(val)
    values ('ABC', 'DEF', 'GHI');

Voila。没问题。