sql - sql server 中超过 4 个部分的 parsename 的替代方法

标签 sql sql-server sql-server-2008

我正在尝试将分开的记录拆分成单独的列。

我有两个问题,

第一,如果我有超过 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

但是这个查询返回空值。

   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

关于sql - sql server 中超过 4 个部分的 parsename 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56625833/

相关文章:

sql - 为什么 CTE(递归)没有并行化(MAXDOP=8)?

sql - SQLite 中带有嵌套 FROM 和 JOIN 的 UPDATE 语句

sql - 如何意外删除表中的所有行

c# - 从项目目录中读取 SQL 查询文件

sql - 错误: Could not create constraint SQL Server 2008

sql - sql View 中的对象名称无效

php - SQL/PHP查询错误

sql-server - SQL代理: Set a Max Execution Time

sql-server - 带有标识列的导入和导出向导

sql - 查询优化不先执行内部查询