Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择管道分隔值_Sql_Sql Server_Split - Fatal编程技术网

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','|')中选择*

我从源代码中获取分隔值,源代码不受编辑控制