【发布时间】:2019-02-14 22:29:53
【问题描述】:
我有一个场景可以从分隔字符串中选择单个值。
例子:
declare @Test varchar(100) = 'ABC|DEF|GHI'
由于数据库是 SQL Server 2008 版本,我无法使用拆分功能。
寻找分别拆分和选择每个值的最佳方法。
【问题讨论】:
标签: sql sql-server split
我有一个场景可以从分隔字符串中选择单个值。
例子:
declare @Test varchar(100) = 'ABC|DEF|GHI'
由于数据库是 SQL Server 2008 版本,我无法使用拆分功能。
寻找分别拆分和选择每个值的最佳方法。
【问题讨论】:
标签: sql sql-server split
您可以使用 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', '|')
【讨论】:
评论太长了。最好的方法是不使用分隔值。相反,您可以使用表变量:
declare @Test table (val varchar(100));
insert into @Test(val)
values ('ABC', 'DEF', 'GHI');
瞧。没问题。
【讨论】: