如何在字符串之间插入逗号

时间:2019-05-09 07:52:35

标签: sql sql-server sql-server-2008-r2

我有一个字符串,我需要在给定的字符串之间插入逗号。请帮我一些想法

declare @a varchar(15) = 'asdfghj'
select @a

我希望输出为'a,s,d,f,g,h,j'

7 个答案:

答案 0 :(得分:1)

这将在sql server 2008中工作

DECLARE @a varchar(max)='23'
DECLARE @b INT=len(@a)

WHILE @b>1
SELECT @a=stuff(@a,@b,0,','),@b-=1

SELECT @a

如果您曾经升级到sql server 2017,则可以使用此版本,假设字符串长度不超过2047个字符(2047是类型= P的spt_values中的最大数字,否则可以使用数字表或类似的表):

DECLARE @a varchar(max)='abcd'

SELECT string_agg(substring(@a,number+1,1),',')
FROM master..spt_values
WHERE number < len(@a)
and type='P'

答案 1 :(得分:0)

我同意Panagiotis Kanavos的强烈评论。下面的代码段将为您工作。

Declare @a varchar(15) = 'asdfghj',@OUTPUT VARCHAR(MAX)= ''

SELECT @OUTPUT = @OUTPUT+AA+',' FROM (
SELECT number ,SUBSTRING(@a, number, 1) AA
FROM master.DBO.spt_values WHERE TYPE = 'P'
AND number BETWEEN 1 AND LEN(@a)
)A
Order by number

SELECT SUBSTRING(@OUTPUT,1,LEN(@OUTPUT)-1)

我使用了spt_values,它没有被Microsoft记录,这不是首选。您可以改用Numbers表尝试相同的操作。

答案 2 :(得分:0)

SQL Server并非旨在执行此操作,但是这是在while循环中执行此操作的简单方法;

    DECLARE @a varchar(15) = 'asdfghj'
    DECLARE @i int = 1
    DECLARE @output varchar(30)

    WHILE (@i <= len(@a))
    BEGIN
        SET @output = ISNULL(@output,'') + ',' + SUBSTRING(@a, @i, 1)
        SET @i = @i + 1
    END

    SET @output = STUFF(@output,1,1,'')

    SELECT @output

输出:a,s,d,f,g,h,j

它接受输入的每个单独字符,并在其前面插入一个逗号。 STUFF函数删除字符串中的第一个逗号,如果需要,可以使用SUBSTRINGRIGHT来完成。

如果您调整@a和@output的长度,这将适用于您传入的任何长度的字符串

答案 3 :(得分:0)

请仔细考虑Panagiotis Kanavos的评论,但是,如果要使用T-SQL进行此操作,一种可能的方法是使用递归CTE和FOR XML(SQL Server 2008支持):

DECLARE @a varchar(15) = 'asdfghj'

;WITH cte AS (
    SELECT SUBSTRING(@a, 1, 1) AS Symbol, 1 AS Position
    UNION ALL
    SELECT SUBSTRING(@a, Position + 1, 1), Position + 1
    FROM cte
    WHERE Position < LEN(@a)
)
SELECT STUFF((
    SELECT CONCAT(N',',  Symbol)
    FROM cte
    ORDER BY Position
    FOR XML PATH('')
), 1, 1, N'') AS Result
OPTION (MAXRECURSION 0)

输出:

Result
a,s,d,f,g,h,j

注意: 仅供参考,从SQL Server 2017开始,您可以使用STRING_AGG()

DECLARE @a varchar(15) = 'asdfghj'

;WITH cte AS (
    SELECT SUBSTRING(@a, 1, 1) AS Symbol, 1 AS Position
    UNION ALL
    SELECT SUBSTRING(@a, Position + 1, 1), Position + 1
    FROM cte
    WHERE Position < LEN(@a)
)
SELECT STRING_AGG(Symbol, ',')
FROM cte
OPTION (MAXRECURSION 0)

答案 4 :(得分:0)

正如已经提到的,这是一个糟糕的主意。

如果可以避免,请不要在SQL Server中执行此操作。

也就是说,如果由于某种原因您无法避免这种情况,那么基于集合的解决方案将涉及一个数字表。如果您没有其中之一,则可以使用cte以很少的开销生成一个。要仅使用一个值,您可以执行以下操作:

declare @a varchar(15) = 'asdfghj';

with t(t)as(select t from(values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))as t(t))
    ,n(n)as(select top(len(@a)) row_number()over(order by(select null)) from t,t t2,t t3,t t4)
select @a = stuff((select ',' + substring(@a,n,1)
                   from n
                   order by n
                   for xml path('')
                  )
                 ,1,1,''
                 );

select @a;

哪个输出:a,s,d,f,g,h,j

或将此逻辑应用于值表,可以执行以下操作:

declare @t table (a varchar(100));
insert into @t values('asdfghj'),('qwerty'),('qwertyuiopasdfghjklzxcvbnm[];#?|');

with t(t)as(select t from(values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))as t(t))
    ,n(n)as(select top(select max(len(a)) from @t) row_number()over(order by(select null)) from t,t t2,t t3,t t4)
select stuff((select ',' + substring(a,n,1)
              from n
              where n.n <= len(t.a)
              order by n.n
              for xml path('')
             )
            ,1,1,''
            ) as CommaDelimited
from @t as t;

哪个输出:

+---------------------------------------------------------------------------+
|                              CommaDelimited                               |
+---------------------------------------------------------------------------+
| a,s,d,f,g,h,j                                                             |
| q,w,e,r,t,y                                                               |
| q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m,[,],;,#,?,|           |
+---------------------------------------------------------------------------+

答案 5 :(得分:0)

希望这行得通,我使用了 STUFF()函数插入

    declare @a varchar(15) = 'asdfghj'
    declare @totalchar int = len(@a)
    declare @counter int = @totalchar

    while @counter >=1
    begin 
            if @counter + 1 <= @totalchar
            begin
                 set @a = stuff(@a,@counter + 1, 0 , ',')
            end
            set @counter = @counter -1
    end

    select @a

答案 6 :(得分:-1)

尝试这种简单的方法...

DECLARE @INPUT VARCHAR(10) = 'ABCD'
DECLARE @i INT = 1
DECLARE @OUTPUT VARCHAR(50) = ''

WHILE @I < = LEN(@INPUT)
BEGIN
    SET @OUTPUT = @OUTPUT + SUBSTRING(@INPUT,@i,1) + ','
    SET @i = @i + 1
END
SET @OUTPUT = SUBSTRING(@OUTPUT,1,LEN(@OUTPUT) - 1)
PRINT @OUTPUT