我有一个字符串,我需要在给定的字符串之间插入逗号。请帮我一些想法
declare @a varchar(15) = 'asdfghj'
select @a
我希望输出为'a,s,d,f,g,h,j'
答案 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
函数删除字符串中的第一个逗号,如果需要,可以使用SUBSTRING
或RIGHT
来完成。
如果您调整@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)
也就是说,如果由于某种原因您无法避免这种情况,那么基于集合的解决方案将涉及一个数字表。如果您没有其中之一,则可以使用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