sql - 反转字符串中每个其他字符的顺序
问题描述
我目前正在从事一个项目,我收到的数据以混乱的顺序提供给我。我需要每 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
解决方案
你可以这样做
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
如果你有多个字符串,那么
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;
推荐阅读
- burp - Burp 不拦截 localhost
- visual-studio-code - 在 VS Code 中按大写首字母搜索文件
- azure - 将文件从浏览器上传到 Azure Blob 存储,无需 SAS 密钥
- android - installExistingPackage 不复制 obb 文件
- rust - 无法从 Polkadot API 更改存储
- r - 如何在嵌套模型的emmeans中使用转换后的参考网格?
- mysql - 我可以使用 sqlalchemy 在 Web 应用程序中使用 scoped_session 调用 `session.close()` 而不是 `ScopedSession.remove()` 吗?
- python - 在numpy数组Python中将负值交换为零
- python - 如何从列表列表中绘制二维直方图?
- r - R:提取一列中的唯一值与另一列中的值匹配