如何反转 sql 服务器中某一列中的字符串?
how to reverse the strings in one of the column in sql server?
我希望将名称列中的所有条目反转并存储在 SQL SERVER 2008 的另一列中。
我不想使用字符串反转功能。
我想用循环来做。
name reversename
---------- ----------
john nhoj
kevin nivek
paul luap
table结构-
承包商(合同号、姓名、电子邮件、电话号码)
我只想要整个名称列的倒序。
我已经试过了
DECLARE @revString VARCHAR(55)=''
DECLARE @string2 VARCHAR(55)= (SELECT NAME FROM CONTRACTOR)
DECLARE @ln INT=LEN(@string2)
WHILE @ln > 0
BEGIN
SET @revString = @revString + SUBSTRING(@string2, @ln, 1)
SET @ln= @ln - 1
END
SELECT @string2, @revString,@ln
也找到了使用循环的解决方案
DECLARE @NAME VARCHAR(MAX)
DECLARE @REVERSE TABLE(
Name VARCHAR(MAX),
ReverseName VARCHAR(MAX))
DECLARE NAME_CURSOR CURSOR FOR
SELECT DISTINCT NAME FROM CONTRACTOR
OPEN NAME_CURSOR
FETCH NEXT FROM NAME_CURSOR
INTO
@NAME
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @revString VARCHAR(55)=''
DECLARE @string2 VARCHAR(55)= @NAME
DECLARE @ln INT=LEN(@string2)
WHILE @ln > 0
BEGIN
SET @revString = @revString + SUBSTRING(@string2, @ln, 1)
SET @ln= @ln - 1
END
INSERT INTO @REVERSE VALUES (@string2, @revString)
FETCH NEXT FROM NAME_CURSOR INTO @NAME
END
SELECT * FROM @REVERSE
CLOSE NAME_CURSOR
DEALLOCATE NAME_CURSOR
好的,显然是家庭作业。除了语法和技术,这里的 要点 是您应该 真正地 尽可能避免循环...想想数据集。
考虑以下因素
1) 子查询 B1 将使用临时计数 table 为字符串中的每个字符创建一条记录。 tally/numbers table 也可以。 internal/temporary 结果如下所示:
2) Cross Apply B中的XML Path部分会按照N
的降序合并记录
例子
Declare @YourTable Table ([name] varchar(50))
Insert Into @YourTable Values
('john')
,('kevin')
,('paul')
Select A.Name
,ReverseName = B.NewString
From @YourTable A
Cross Apply (
Select NewString = Stuff((Select '' +C
From (
Select N,C = substring(A.Name,N,1)
From (Select Top (len(A.Name)) N=Row_Number() Over (Order By (Select NULL)) From master..spt_values ) A1
) B1
Order By N Desc
FOR XML PATH(''),TYPE).value('(./text())[1]','NVARCHAR(MAX)')
,1,0,'')
) B
最终结果
创建这个函数
CREATE FUNCTION [dbo].[revString] (@input VARCHAR(250))
RETURNS VARCHAR(250)
AS BEGIN
DECLARE @strCount int;
DECLARE @revStr varchar(250) ='';
declare @cnt int ;
set @strCount = LEN(@input);
set @cnt= @strCount;
While @cnt>0
begin
set @revStr= @revStr + substring(@input,@cnt,1);
set @cnt =@cnt-1;
end
RETURN @revStr
END
select dbo.revString('ASSDE') -- 结果 (EDSSA)
这是使用一种循环,通过加入计数 table 并以相反的顺序连接值。
DECLARE @test table(name varchar(10))
INSERT @test values('John'),('Tom Jones')
;WITH N(N)AS
(
SELECT
1
FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N)
),
tally(N)AS
(
SELECT ROW_NUMBER()OVER(ORDER BY N.N)
FROM N,N a,N b,N c,N d,N e,N f
)
SELECT
*
FROM
@test t
CROSS APPLY
(
SELECT
(
SELECT z
FROM
(SELECT substring(name, N, 1) z, N
FROM tally
WHERE n < =LEN(name)) t1
ORDER BY N DESC
FOR xml path(''), type
).value('.', 'varchar(max)') z
) y
我希望将名称列中的所有条目反转并存储在 SQL SERVER 2008 的另一列中。 我不想使用字符串反转功能。 我想用循环来做。
name reversename
---------- ----------
john nhoj
kevin nivek
paul luap
table结构- 承包商(合同号、姓名、电子邮件、电话号码)
我只想要整个名称列的倒序。
我已经试过了
DECLARE @revString VARCHAR(55)=''
DECLARE @string2 VARCHAR(55)= (SELECT NAME FROM CONTRACTOR)
DECLARE @ln INT=LEN(@string2)
WHILE @ln > 0
BEGIN
SET @revString = @revString + SUBSTRING(@string2, @ln, 1)
SET @ln= @ln - 1
END
SELECT @string2, @revString,@ln
也找到了使用循环的解决方案
DECLARE @NAME VARCHAR(MAX)
DECLARE @REVERSE TABLE(
Name VARCHAR(MAX),
ReverseName VARCHAR(MAX))
DECLARE NAME_CURSOR CURSOR FOR
SELECT DISTINCT NAME FROM CONTRACTOR
OPEN NAME_CURSOR
FETCH NEXT FROM NAME_CURSOR
INTO
@NAME
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @revString VARCHAR(55)=''
DECLARE @string2 VARCHAR(55)= @NAME
DECLARE @ln INT=LEN(@string2)
WHILE @ln > 0
BEGIN
SET @revString = @revString + SUBSTRING(@string2, @ln, 1)
SET @ln= @ln - 1
END
INSERT INTO @REVERSE VALUES (@string2, @revString)
FETCH NEXT FROM NAME_CURSOR INTO @NAME
END
SELECT * FROM @REVERSE
CLOSE NAME_CURSOR
DEALLOCATE NAME_CURSOR
好的,显然是家庭作业。除了语法和技术,这里的 要点 是您应该 真正地 尽可能避免循环...想想数据集。
考虑以下因素
1) 子查询 B1 将使用临时计数 table 为字符串中的每个字符创建一条记录。 tally/numbers table 也可以。 internal/temporary 结果如下所示:
2) Cross Apply B中的XML Path部分会按照N
的降序合并记录例子
Declare @YourTable Table ([name] varchar(50))
Insert Into @YourTable Values
('john')
,('kevin')
,('paul')
Select A.Name
,ReverseName = B.NewString
From @YourTable A
Cross Apply (
Select NewString = Stuff((Select '' +C
From (
Select N,C = substring(A.Name,N,1)
From (Select Top (len(A.Name)) N=Row_Number() Over (Order By (Select NULL)) From master..spt_values ) A1
) B1
Order By N Desc
FOR XML PATH(''),TYPE).value('(./text())[1]','NVARCHAR(MAX)')
,1,0,'')
) B
最终结果
创建这个函数
CREATE FUNCTION [dbo].[revString] (@input VARCHAR(250))
RETURNS VARCHAR(250)
AS BEGIN
DECLARE @strCount int;
DECLARE @revStr varchar(250) ='';
declare @cnt int ;
set @strCount = LEN(@input);
set @cnt= @strCount;
While @cnt>0
begin
set @revStr= @revStr + substring(@input,@cnt,1);
set @cnt =@cnt-1;
end
RETURN @revStr
END
select dbo.revString('ASSDE') -- 结果 (EDSSA)
这是使用一种循环,通过加入计数 table 并以相反的顺序连接值。
DECLARE @test table(name varchar(10))
INSERT @test values('John'),('Tom Jones')
;WITH N(N)AS
(
SELECT
1
FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N)
),
tally(N)AS
(
SELECT ROW_NUMBER()OVER(ORDER BY N.N)
FROM N,N a,N b,N c,N d,N e,N f
)
SELECT
*
FROM
@test t
CROSS APPLY
(
SELECT
(
SELECT z
FROM
(SELECT substring(name, N, 1) z, N
FROM tally
WHERE n < =LEN(name)) t1
ORDER BY N DESC
FOR xml path(''), type
).value('.', 'varchar(max)') z
) y