如果没有数据,则字符串拆分忽略最后一个定界符

时间:2018-11-22 22:51:23

标签: sql sql-server split

我将字符串分割成逗号分隔的一些值。 但是,某些值的末尾会有一个逗号。

示例

Userid |   Value
1      |   A,B,C,D,
2      |   F,H

代码

select value
from string_split('A,B,C,D,',',')

当前输出

UserId |   Value
1      |   A
1      |   B
1      |   C
1      |   D
1      |   

如果没有后续数据,是否有任何方法可以使字符串拆分函数忽略最后一个逗号?

所需的输出

UserId |   Value
1      |   A
1      |   B
1      |   C
1      |   D

使用MSSQL

2 个答案:

答案 0 :(得分:0)

STRING_SPLIT函数不支持较低版本的sql server,因此请先创建一个函数以拆分给定的字符串,然后将该函数与您的select查询结合。以下是为您提供预期结果的示例。 创建的用户定义函数

CREATE FUNCTION [dbo].[Udf_StringSplit]
(
@Userid INT,
@Value VARCHAR(1000)

)
RETURNS @Result TABLE(
    Userid INT,
    Value VARCHAR(10)
) 
AS BEGIN
DECLARE @Data AS TABLE
(
Userid INT,
Value VARCHAR(100)
)
INSERT INTO @Data(Userid,Value)
SELECT @Userid, @Value

INSERT INTO @Result(Userid,Value)
SELECT Userid,
      Split.a.value('.','nvarchar(1000)') AS Value
FROM
(
SELECT Userid,
        CAST('<S>'+REPLACE(@Value,',','</S><S>')+'</S>'   AS XML) Value
FROM @Data
) AS A
CROSS APPLY Value.nodes('S') AS Split(a)
WHERE Userid=@Userid AND Split.a.value('.','nvarchar(1000)') <>''  
RETURN
END
GO

样本数据表

DECLARE @Data AS TABLE(Userid INT ,  Value VARCHAR(100))
INSERT INTO @Data
SELECT 1,'A,B,C,D,' UNION ALL
SELECT 2,'F,H'

Sql脚本以获取预期结果

SELECT  d.Userid,
        f.Value
FROM  @Data d 
CROSS APPLY [dbo].[Udf_StringSplit] (d.Userid,d.Value) AS f
WHERE d.Userid=1
GO

结果

Userid  Value
------------
1       A
1       B
1       C
1       D

答案 1 :(得分:0)

只需添加“ WHERE”这样的句子:

select value
from string_split('A,B,C,D,',',')
WHERE value <> ''