尝试(扩大)下面的查询,使用XML路径,理货数字表和解码表:
CREATE TABLE #TTMMPP (ORIG CHAR(1), NEWC CHAR(1));
/* add all values to shift */
INSERT INTO #TTMMPP VALUES ('a','b'),('b','c'),('c','d'),('d','e'),('e','f') /*, ....*/
;
/* N as max len of your string */
CREATE TABLE #TTMMPP2 (N smallint);
DECLARE @I INT
DECLARE @ROWS INT
SET @I = 1
SET @ROWS = 1000
WHILE @I < @ROWS
BEGIN
INSERT INTO #TTMMPP2 VALUES (@I)
SET @I = @I + 1
END
----------------------------------------
DECLARE @my_str VARCHAR(100) = 'abcd';
SELECT @my_str AS ORIGINAL,
(
SELECT ''+C.NEWC
FROM (
SELECT N, SUBSTRING(@my_str, N,1) AS X, B.NEWC
FROM #TTMMPP2 A
INNER JOIN #TTMMPP B ON SUBSTRING(@my_str,A.N,1)= B.ORIG
WHERE N<=LEN(@my_str)
) C
FOR XML PATH('')
) AS SHIFTED;
输出:
ORIGINAL SHIFTED
abcd bcde
更新版本:如果您想在解码选项卡中找不到“标记”字符乐你可以使用这个(变化不大查询:LEFT JOIN和COALESCE):
DECLARE @my_str VARCHAR(100) = 'abcdefg';
SELECT @my_str AS ORIGINAL,
(
SELECT ''+C.NEWC
FROM (
SELECT N, SUBSTRING(@my_str, N,1) AS X, COALESCE(B.NEWC,'*') AS NEWC
FROM #TTMMPP2 A
LEFT JOIN #TTMMPP B ON SUBSTRING(@my_str,A.N,1)= B.ORIG
WHERE N<=LEN(@my_str)
) C
ORDER BY N
FOR XML PATH('')
) AS SHIFTED;
输出(在解码表中找不到*替代字符):
ORIGINAL SHIFTED
abcdefg bcde***
新的更新(如您最后的评论补充):
SELECT @my_str AS ORIGINAL,
(
SELECT ''+C.NEWC
FROM (
SELECT N, SUBSTRING(@my_str, N,1) AS X, COALESCE(B.NEWC,SUBSTRING(@my_str,A.N,1)) AS NEWC
FROM ##TTMMPP2 A
LEFT JOIN #TTMMPP B ON SUBSTRING(@my_str,A.N,1) COLLATE Latin1_General_BIN = B.ORIG COLLATE Latin1_General_BIN
WHERE N<=LEN(@my_str)
) C
ORDER BY N
FOR XML PATH('')
) AS SHIFTED
输出:
ORIGINAL SHIFTED
abcdefgA bcdeefgA
我会说你可以创建这个作为UDF – LONG
我应该补充说,任何字符不是在映射表应保持原样。 abcdef-zz => bcdefg-aa 此外,我需要使用COLLATION,以便使用映射正确替换大写/小写。 – pdube