首页 > 解决方案 > 反转字符串中每个其他字符的顺序

问题描述

我目前正在从事一个项目,我收到的数据以混乱的顺序提供给我。我需要每 2 个字符来切换字符串中的位置。目前我有以下代码,但它在函数或存储过程中速度非常慢。任何帮助,将不胜感激。

例如:FK741 OCEV需要KF47 1COVE

ALTER FUNCTION [dbo].[UnscrambleData] 
(
    @scrambled varchar(50) 
)
RETURNS varchar(50)
AS
BEGIN
    Declare @unscrambled varchar(50)
    Declare @temp1 varchar(1)
    DECLARE @cnt INT = 0;
    Declare @cnt_Total INT =len(@scrambled)

    WHILE @cnt < = @cnt_total
       if((@cnt%2)=0)
       begin 
             set @unscrambled=CONCAT( @unscrambled,SUBSTRING(@scrambled, @cnt, 1),@temp1)
             set @temp1=''
       end
   else if (@cnt_Total%2<>0 and @cnt_Total-@cnt<2)
       begin
              set @unscrambled=CONCAT( @unscrambled,SUBSTRING(@scrambled, @cnt, 1))
       end
   else
       begin
             set @temp1= SUBSTRING(@scrambled, @cnt, 1)
       end
   SET @cnt = @cnt + 1;

    RETURN @unscrambled;
END

标签: sqlsql-servertsql

解决方案


你可以这样做

SELECT STRING_AGG(REVERSE(V), '')
FROM
(
  VALUES
  ('FK741 OCEV')
) T(Str) CROSS APPLY
(
  SELECT SUBSTRING(Str, Number-1, 2)
  FROM Master..spt_values --Tally table
  WHERE [Type] = 'P'
        AND Number BETWEEN 1 AND LEN(Str)
        AND Number % 2 = 0
) TT(V)

回报:

KF47 1COVE

Online Demo

如果你有多个字符串,那么

SELECT STRING_AGG(REVERSE(V), '')
FROM
(
  VALUES
  (1, 'FK741 OCEV'),
  (2, 'ABC DEF GH'),
  (3, 'THIRD STRING')
) T(Id, Str) CROSS APPLY
(
  SELECT SUBSTRING(Str, Number-1, 2)
  FROM Master..spt_values
  WHERE [Type] = 'P'
        AND Number BETWEEN 1 AND LEN(Str)
        AND Number % 2 = 0
) TT(V)
GROUP BY T.Id;

推荐阅读