ram*_*aaa 17 sql database sql-server string
我在数据库中有一个逗号分隔的字符串.像'apple,banana,pineapple,grapes'我需要在逗号的基础上拆分这个字符串并遍历这个.因为在sql server中没有内置函数,是有任何有效的方法可以实现这一目标.
Vig*_*r A 28
试试这个功能
CREATE FUNCTION [dbo].[func_Split]
(
@DelimitedString varchar(8000),
@Delimiter varchar(100)
)
RETURNS @tblArray TABLE
(
ElementID int IDENTITY(1,1), -- Array index
Element varchar(1000) -- Array element contents
)
AS
BEGIN
-- Local Variable Declarations
-- ---------------------------
DECLARE @Index smallint,
@Start smallint,
@DelSize smallint
SET @DelSize = LEN(@Delimiter)
-- Loop through source string and add elements to destination table array
-- ----------------------------------------------------------------------
WHILE LEN(@DelimitedString) > 0
BEGIN
SET @Index = CHARINDEX(@Delimiter, @DelimitedString)
IF @Index = 0
BEGIN
INSERT INTO
@tblArray
(Element)
VALUES
(LTRIM(RTRIM(@DelimitedString)))
BREAK
END
ELSE
BEGIN
INSERT INTO
@tblArray
(Element)
VALUES
(LTRIM(RTRIM(SUBSTRING(@DelimitedString, 1,@Index - 1))))
SET @Start = @Index + @DelSize
SET @DelimitedString = SUBSTRING(@DelimitedString, @Start , LEN(@DelimitedString) - @Start + 1)
END
END
RETURN
END
Run Code Online (Sandbox Code Playgroud)
示例用法 - 只需将函数传递给逗号分隔的字符串以及所需的分隔符.
DECLARE @SQLStr varchar(100)
SELECT @SQLStr = 'Mickey Mouse, Goofy, Donald Duck, Pluto, Minnie Mouse'
SELECT
*
FROM
dbo.func_split(@SQLStr, ',')
Run Code Online (Sandbox Code Playgroud)
结果将是这样的

Mar*_*ith 16
...由于sql server中没有内置函数...
当你提出这个问题但SQL Server 2016引入时,情况确实如此STRING_SPLIT.
所以你可以使用
SELECT value
FROM STRING_SPLIT ('apple,banana,pineapple,grapes', ',')
Run Code Online (Sandbox Code Playgroud)
存在一些限制(仅接受单个字符分隔符,并且缺少任何指示拆分索引最引人注目的列).性能测试的各种限制和一些有希望的结果都在Aaron Bertrand的博客文章中.
您可以将数据转换为XML,方法是将逗号替换为自定义标记,在本例中<w>为单词.
create table t(col varchar(255));
insert into t values ('apple,banana,pineapple,grapes');
insert into t values ('car,bike,airplane');
select cast(('<w>' + replace(col, ',', '</w><w>') + '</w>') as xml) as xmlValue
from t
Run Code Online (Sandbox Code Playgroud)
哪个回报
| XMLVALUE |
|--------------------------------------------------------|
| <w>apple</w><w>banana</w><w>pineapple</w><w>grapes</w> |
| <w>car</w><w>bike</w><w>airplane</w> |
Run Code Online (Sandbox Code Playgroud)
现在,如果您将此查询用作内部xml选择,则外部查询可以将其拆分为不同的行:
解:
select split.xmlTable.value('.', 'varchar(255)') as xmlValue
from (
select cast(('<w>' + replace(col, ',', '</w><w>') + '</w>') as xml) as xmlValue
from t
) as xmlTable
cross apply xmlValue.nodes ('/w') as split(xmlTable);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
62541 次 |
| 最近记录: |