我正在尝试将单独的记录拆分为单独的列。
我有 2 个问题,
第一个,如果我有超过 4 个分隔值,则 parsename 返回 NULL
第二如果我有“.”在我的行中它也返回 Null。
这是我所做的查询并且工作正常。
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。
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 不起作用,如何将逗号分隔的项目拆分到不同的列中?
这是对我有用的功能:
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
创建以下函数,它将像 ParseName 一样工作,但对于具有任何分隔符的任意数量的部分:
create FUNCTION GetStringParts(@SplittedString nvarchar(300), @Part int, @SplitChar nvarchar(1))
Returns nvarchar(300)
as
begin
if(@Part < 1)
return '';
declare @Index int = 1, @Result nvarchar(300) = @SplittedString, @PatIndexResult int
while @Index < @Part
begin
set @PatIndexResult = PATINDEX('%' + @SplitChar + '%', @Result)
if(@PatIndexResult = 0)
return '';
set @Result = SUBSTRING(@Result, @PatIndexResult + 1, len(@Result));
set @Index = @Index + 1;
end
set @PatIndexResult = PATINDEX('%' + @SplitChar + '%', @Result);
if(@PatIndexResult = 0)
return @Result;
return substring(@Result, 0, patindex('%' + @SplitChar + '%', @Result));
end
declare @t table (items varchar(50))
插入@t值('苹果,香蕉,芒果,菠萝') ---在苹果之后你就得到了句号。 Parsename 是一个 4 值分隔符。 --因此替换(@t,'.','')
从@t中选择*
选择 PARSENAME(REPLACE(REPLACE(items,'.',''),',','.'),4) Col1, PARSENAME(REPLACE(REPLACE(items,'.',''),',','.'),3) Col2, PARSENAME(REPLACE(REPLACE(items,'.',''),',','.'),2) Col3, PARSENAME(REPLACE(REPLACE(items,'.',''),',','.'),1) Col4 来自@t