Sql 如何在字符串之间插入逗号
我有一个字符串,我需要在给定字符串之间插入一个逗号。请帮我提一些想法Sql 如何在字符串之间插入逗号,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一个字符串,我需要在给定字符串之间插入一个逗号。请帮我提一些想法 declare @a varchar(15) = 'asdfghj' select @a 我希望输出为“a,s,d,f,g,h,j”我非常同意Panagiotis Kanavos的评论。下面的代码片段将适用于您 Declare @a varchar(15) = 'asdfghj',@OUTPUT VARCHAR(MAX)= '' SELECT @OUTPUT = @OUTPUT+AA+',' FROM ( SELECT n
declare @a varchar(15) = 'asdfghj'
select @a
我希望输出为“a,s,d,f,g,h,j”我非常同意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_值,这是不可取的。您可以用数字表来代替 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函数删除字符串中的第一个逗号,如果愿意,可以使用子字符串或右键执行此操作
如果您调整@a和@output的长度,这将适用于您传入的任何长度字符串,请仔细考虑Panagiotis Kanavos的评论,但如果您希望使用T-SQL实现这一点,一种可能的方法是使用递归CTE和SQL Server 2008支持的XML:
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)
注:
仅供参考,从SQL Server 2017开始,您可以使用:
试试这个简单的方法 声明@INPUT VARCHAR10='ABCD' 声明@i INT=1 声明@OUTPUT VARCHAR50= 而@I<=LEN@INPUT 开始 设置@OUTPUT=@OUTPUT+SUBSTRING@INPUT,@i,1+,' 设置@i=@i+1 终止 设置@OUTPUT=SUBSTRING@OUTPUT1.LEN@OUTPUT - 1 打印@输出
这将在SQLServer2008中起作用
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是spt_值中type=p的最大数字,否则可以使用数字表或类似工具:
DECLARE @a varchar(max)='abcd'
SELECT string_agg(substring(@a,number+1,1),',')
FROM master..spt_values
WHERE number < len(@a)
and type='P'
正如已经提到的,这是一个可怕的想法。
如果可以避免,请不要在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;
希望这能起作用,我用STUFF函数插入
首先不要在SQL中这样做。SQL语言在字符串操作方面非常差。你为什么要这么做?你想做什么?这根绳子是从哪里来的?也许有更好的方法来做你想做的事情,而不涉及字符串操作递归cte?下面的答案可能会对你有所帮助,但无论你使用什么,它都会大大降低你的查询速度。我想很多人都有这个问题。我不同意关闭的建议,也不同意所有的否决票。我本希望这会包含在sql server 2016的字符串分割中。复制其他人的答案并重新发布(只做很小的更改)通常被认为是不好的形式。亲爱的@Rich Benner。这是我自己的代码。我没有抄袭兄弟。你可以用“不告诉任何人”的方法稍微改进你的答案
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;
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,[,],;,#,?,| |
+---------------------------------------------------------------------------+
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