String Split Ignore Последний разделитель, если нет данных - PullRequest
0 голосов
/ 23 ноября 2018

Я разбиваю строки на значения, разделенные запятыми на строки.Однако некоторые значения имеют дополнительную запятую в конце.

Пример

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

1 Ответ

0 голосов
/ 23 ноября 2018

STRING_SPLIT Функция не поддерживает более низкую версию сервера sql, поэтому сначала создайте функцию для разбиения заданной строки и присоедините функцию к вашему запросу 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
...