Альтернатива для parsename для более чем 4 частей на сервере SQL - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь разделить отдельные записи на отдельные столбцы.

У меня 2 проблемы,

1-е, если у меня больше 4, разделенные значения, чем parsename, возвращают NULL

2-й, если у меня есть "." в моих строках, кроме того, он также возвращает нуль.

Это запрос, который я сделал и работает нормально.

   declare @t table (items varchar(50))

   insert into @t values ('Apple,banana,mango,pineapple')

   select * from @t

   SELECT 
   PARSENAME(REPLACE(items,',','.'),4) Col1,
   PARSENAME(REPLACE(items,',','.'),3) Col2,
   PARSENAME(REPLACE(items,',','.'),2) Col3,
   PARSENAME(REPLACE(items,',','.'),1) Col4
   FROM @t

Но этот запрос возвращает ноль.

   declare @t table (items varchar(50))

   insert into @t values ('Apple.,banana,mango,pineapple')

   select * from @t

   SELECT 
   PARSENAME(REPLACE(items,',','.'),4) Col1,
   PARSENAME(REPLACE(items,',','.'),3) Col2,
   PARSENAME(REPLACE(items,',','.'),2) Col3,
   PARSENAME(REPLACE(items,',','.'),1) Col4
   FROM @t

Из-за '.'

А также, если я добавлю еще один фрукт в столбец моего предмета, он вернет значение Null.

ТАК у меня вопрос, как разделить запятые в другом столбце, если parsename не работает?

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Это функция, которая работает для меня:

CREATE FUNCTION [dbo].[Split](
@str VARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @returnTable TABLE (idx INT PRIMARY KEY IDENTITY, item VARCHAR(8000))
AS
BEGIN
DECLARE @pos INT
SELECT @str = @str + @delimiter
WHILE LEN(@str) > 0 
    BEGIN
        SELECT @pos = CHARINDEX(@delimiter,@str)
        IF @pos = 1
            INSERT @returnTable (item)
                VALUES (NULL)
        ELSE
            INSERT @returnTable (item)
                VALUES (SUBSTRING(@str, 1, @pos-1))
        SELECT @str = SUBSTRING(@str, @pos+1, LEN(@str)-@pos)       
    END
RETURN
END

Это окончательные результаты:

declare @t table (items varchar(50))

INSERT INTO @t VALUES ('Apple.,banana,mango,pineapple,Cherry')

select 
(select item from fn_split(items,',') a where idx in (1)) as col1,
(select item from fn_split(items,',') a where idx in (2)) as col2,
(select item from fn_split(items,',') a where idx in (3)) as col3,
(select item from fn_split(items,',') a where idx in (4)) as col4,
(select item from fn_split(items,',') a where idx in (5)) as col5
 from @t
0 голосов
/ 17 июня 2019

Попробуйте ЗАМЕНИТЬ (.) С помощью '', прежде чем применять другие функции, как показано ниже: *

DECLARE @t TABLE (items VARCHAR(50))

INSERT INTO @t VALUES ('Apple.,banana,mango,pineapple')

SELECT 
PARSENAME(REPLACE(REPLACE(items,'.',''),',','.'),4) Col1,
PARSENAME(REPLACE(REPLACE(items,'.',''),',','.'),3) Col2,
PARSENAME(REPLACE(REPLACE(items,'.',''),',','.'),2) Col3,
PARSENAME(REPLACE(REPLACE(items,'.',''),',','.'),1) Col4
FROM @t

AS (.) - зарезервированный символ для PARSENAME, вы можете применить двойную замену, чтобы сохранить (.) В вашемвыход.Сначала спрячьте (.) С необычным набором символов и, наконец, снова замените Необычный характер на (.), Как показано ниже -

DECLARE @t TABLE (items VARCHAR(50))

INSERT INTO @t VALUES ('Apple.,banana,mango,pineapple')

SELECT 
REPLACE(PARSENAME(REPLACE(REPLACE(items,'.','##@@##'),',','.'),4),'##@@##','.') Col1,
REPLACE(PARSENAME(REPLACE(REPLACE(items,'.','##@@##'),',','.'),3),'##@@##','.') Col2,
REPLACE(PARSENAME(REPLACE(REPLACE(items,'.','##@@##'),',','.'),2),'##@@##','.') Col3,
REPLACE(PARSENAME(REPLACE(REPLACE(items,'.','##@@##'),',','.'),1),'##@@##','.') Col4
FROM @t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...