我有一个像"Planck, Albert, Bohr"
我希望输出为"Bohr Albert Planck"
我希望使用SQL服务器完成此操作。我看到许多字符串拆分函数都将数据作为表和前向顺序返回。这些不是我的目的。
任何指针都会有所帮助。
答案 0 :(得分:2)
如果你使用像this那样的分割字符串函数,你可以这样做。
declare @S varchar(20) = 'Planck, Albert, Bohr'
select
(
select ltrim(s)+' '
from dbo.Split(',', @S)
order by pn desc
for xml path(''), type
).value('.', 'varchar(max)')
答案 1 :(得分:1)
这就是你想要的:
DECLARE @source VARCHAR(MAX)
DECLARE @dest VARCHAR(MAX)
DECLARE @lenght INT
SET @source = 'Planck, Albert, Bohr'
SET @dest = ''
WHILE LEN(@source) > 0
BEGIN
IF CHARINDEX(' ', @source) > 0
BEGIN
SET @dest = SUBSTRING(@source,0,CHARINDEX(' ', @source)) + ' ' + @dest
SET @source = LTRIM(RTRIM(SUBSTRING(@source,CHARINDEX(' ',
@source)+1,LEN(@source))))
END
ELSE
BEGIN
SET @dest = @source + ' ' + @dest
SET @source = ''
END
END
SELECT REPLACE(REPLACE(@dest,Char(44),''),Char(13), '')
Char(44)
是,
的ASCII值,所以最后我只是替换了那个字符。
这将打印Bohr Albert Planck
。
答案 2 :(得分:0)
Declare @inStr varchar(1000)='Planck, Albert, Bohr'
;WITH CTE AS(
select ltrim(rtrim(reverse(left(reverse(@instr),CHARINDEX(',',reverse(@instr),1)-1)))) as strg,RIGHT(reverse(@instr),LEN(reverse(@instr))-CHARINDEX(',',reverse(@instr),1)) as rem
union all
select CASE WHEN CHARINDEX(',',c.rem,1)>0 then ltrim(rtrim(reverse(left(rem,CHARINDEX(',',rem,1)-1)))) else reverse(rem) end,
CASE WHEN CHARINDEX(',',c.rem,1)>0 then RIGHT(c.rem,LEN(rem)-CHARINDEX(',',rem,1)) else '' end
from CTE c
where len(rem) > 0 --CHARINDEX(',',c.rem,1)>0
)
select stuff((select ' '+strg from CTE for xml path('')),1,1,'')