将字符串的每个字符替换为ms server 2014中的另一个字符

问题描述 投票:0回答:3

我正在使用Microsoft SQL Server 2014,正在尝试更新表中的某些列。

我想用另一个字符替换字符串中的每个字符。

例如,单词:

HELLO123

我想用T代替H,用Q代替E,用Y代替L,用I代替O,用6代替1,用7代替2,用8代替3,等等。]

我不确定Microsoft SQL Server 2014是否支持正则表达式,即在具有数百万行的表上创建函数并遍历每个字符并进行替换将花费很长时间。

任何人都有像正则表达式一样工作并且可以很快的解决方案吗?

谢谢

我正在使用Microsoft SQL Server 2014,正在尝试更新表中的某些列。我想用另一个字符替换字符串中的每个字符。例如,单词:...

sql-server sql-server-2014 scramble
3个回答
0
投票

[如果您没有注意到,REPLACE的问题是您需要嵌套值,但是,因为嵌套的是REPLACE(REPLACE('HELLO','H','E'),'E','Q')之类的东西会在'QQLLO'中返回,而不是'EQLLO'。如评论中所述,SQL Server 2017引入了TRANSLATE,它将只处理一次字符,但是,当您使用2014时,就不能使用它(TRANSLATE('HELLO','HE','EQ'))。


0
投票
--this could work if the strings are all uppercase --<-- not true
--you could use nchar & foreign characters and handle everything correctly...it is just a pain to type...
declare @s varchar(20) = 'HELLO123';

--lower case everything
select @s = lower(@s)

--handle numbers with non printable characters  --> number to char() --> char() to new number
select @s = replace(replace(replace(replace(replace(replace(@s, '1', char(1)), '2', char(2)), '3', char(3)), char(1), '6'), char(2), '7'), char(3), '8')


--handle letters with case sensitive replacement (using a CS collation)
--(all letters are lowercased)lowercase letter --> new uppercase letter
select replace(replace(replace(replace(@s collate SQL_Latin1_General_CP1_CS_AS, 'h' , 'T'), 'e', 'Q'), 'l', 'Y'),  'o', 'I'); 



SELECT UPPER(REPLACE(REPLACE(LOWER('HELLO') collate SQL_Latin1_General_CP1_CS_AS, 'h','E'),'e','Q'));


GO

/*
SELECT dbo.shiftchars('0123456789::ABCDEFGHIJKLMNOPQRSTUVWXYZ::abcdefghijklmnopqrstuvwxyz');

just for fun *using a single replace()*
not for millions of rows
suitable for standard latin alphanumeric
extended ascii & non printable chars are not handled correctly.
*/

CREATE FUNCTION dbo.shiftchars(@s VARCHAR(8000))
RETURNS VARCHAR(8000)
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS
BEGIN
        SELECT @s = REPLACE(@s, f collate SQL_Latin1_General_CP1_CS_AS , t)
        FROM
        (
        VALUES
            (1, '1', CHAR(1)),
            (1, '2', CHAR(2)),
            (1, '3', CHAR(3)),
            (1, '4', CHAR(4)),
            (1, '5', CHAR(5)),
            (1, '6', CHAR(6)),
            (1, '7', CHAR(7)),
            (1, '8', CHAR(8)),
            (1, '9', CHAR(9)),
            (1, '0', CHAR(254)),
            (1, 'A', CHAR(128)),
            (1, 'B', CHAR(129)),
            (1, 'C', CHAR(130)),
            (1, 'D', CHAR(131)),
            (1, 'E', CHAR(132)),
            (1, 'F', CHAR(133)),
            (1, 'G', CHAR(134)),
            (1, 'H', CHAR(135)),
            (1, 'I', CHAR(136)),
            (1, 'J', CHAR(137)),
            (1, 'K', CHAR(138)),
            (1, 'L', CHAR(139)),        
            (1, 'M', CHAR(140)),
            (1, 'N', CHAR(141)),
            (1, 'O', CHAR(142)),        
            (1, 'P', CHAR(143)),
            (1, 'Q', CHAR(144)),
            (1, 'R', CHAR(145)),        
            (1, 'S', CHAR(146)),
            (1, 'T', CHAR(147)),    
            (1, 'U', CHAR(148)),        
            (1, 'V', CHAR(149)),
            (1, 'W', CHAR(150)),
            (1, 'X', CHAR(151)),        
            (1, 'Y', CHAR(152)),
            (1, 'Z', CHAR(153)),
            (1, 'a', CHAR(154)),
            (1, 'b', CHAR(155)),
            (1, 'c', CHAR(156)),
            (1, 'd', CHAR(157)),
            (1, 'e', CHAR(158)),
            (1, 'f', CHAR(159)),
            (1, 'g', CHAR(160)),
            (1, 'h', CHAR(161)),
            (1, 'i', CHAR(162)),
            (1, 'j', CHAR(163)),
            (1, 'k', CHAR(164)),
            (1, 'l', CHAR(165)),        
            (1, 'm', CHAR(166)),
            (1, 'n', CHAR(167)),
            (1, 'o', CHAR(168)),        
            (1, 'p', CHAR(169)),
            (1, 'q', CHAR(170)),
            (1, 'r', CHAR(171)),        
            (1, 's', CHAR(172)),
            (1, 't', CHAR(173)),    
            (1, 'u', CHAR(174)),        
            (1, 'v', CHAR(175)),
            (1, 'w', CHAR(176)),
            (1, 'x', CHAR(177)),        
            (1, 'y', CHAR(178)),
            (1, 'z', CHAR(179)),
            --------------------
            (2, CHAR(1), '6'),
            (2, CHAR(2), '7'),
            (2, CHAR(3), '8'),
            (2, CHAR(4), '9'),
            (2, CHAR(5), '0'),
            (2, CHAR(6), '1'),
            (2, CHAR(7), '2'),
            (2, CHAR(8), '3'),
            (2, CHAR(9), '4'),
            (2, CHAR(254), '5'),
            (2, CHAR(128), 'M'),
            (2, CHAR(129), 'N'),
            (2, CHAR(130), 'O'),
            (2, CHAR(131), 'P'),
            (2, CHAR(132), 'Q'),
            (2, CHAR(133), 'R'),
            (2, CHAR(134), 'S'),
            (2, CHAR(135), 'T'),
            (2, CHAR(136), 'U'),
            (2, CHAR(137), 'V'),
            (2, CHAR(138), 'W'),
            (2, CHAR(139), 'X'),            
            (2, CHAR(140), 'Y'),
            (2, CHAR(141), 'Z'),
            (2, CHAR(142), 'A'),            
            (2, CHAR(143), 'B'),
            (2, CHAR(144), 'C'),
            (2, CHAR(145), 'D'),            
            (2, CHAR(146), 'E'),
            (2, CHAR(147), 'F'),        
            (2, CHAR(148), 'G'),            
            (2, CHAR(149), 'H'),
            (2, CHAR(150), 'I'),
            (2, CHAR(151), 'J'),            
            (2, CHAR(152), 'K'),
            (2, CHAR(153), 'L'),
            (2, CHAR(154), 'm'),
            (2, CHAR(155), 'n'),
            (2, CHAR(156), 'o'),
            (2, CHAR(157), 'p'),
            (2, CHAR(158), 'q'),
            (2, CHAR(159), 'r'),
            (2, CHAR(160), 's'),
            (2, CHAR(161), 't'),
            (2, CHAR(162), 'u'),
            (2, CHAR(163), 'v'),
            (2, CHAR(164), 'w'),
            (2, CHAR(165), 'x'),            
            (2, CHAR(166), 'y'),
            (2, CHAR(167), 'z'),
            (2, CHAR(168), 'a'),            
            (2, CHAR(169), 'b'),
            (2, CHAR(170), 'c'),
            (2, CHAR(171), 'd'),            
            (2, CHAR(172), 'e'),
            (2, CHAR(173), 'f'),        
            (2, CHAR(174), 'g'),            
            (2, CHAR(175), 'h'),
            (2, CHAR(176), 'i'),
            (2, CHAR(177), 'j'),            
            (2, CHAR(178), 'k'),
            (2, CHAR(179), 'l')                 
        ) AS v(o, f, t)
        ORDER BY o;

    RETURN (@s);

END

0
投票

无需功能或CLR,就可以在Sql Server 2014上进行这种加扰。

© www.soinside.com 2019 - 2024. All rights reserved.