使用转换表在不使用while循环的SQL中使用mutate字符串

时间:2016-05-31 14:58:33

标签: sql tsql

我有一个翻译表,里面有两个钱栏:原始字符和要替换它的字符。 A列中没有字符包含在B列中,反之亦然。给定一个字符串,我想迭代翻译表的每一行,用A列中的字符替换A列中找到的输入字符串的每个字符,并返回完全翻译的结果。我知道如何使用while循环执行此操作,但如果可能的话,我不想使用它,因为它们可能很慢。

更新:

翻译表示例:

ColA  | ColB

%     |   P
$     |   D

输入字符串:%EN $ ANT

预期输出:PENDANT

1 个答案:

答案 0 :(得分:0)

如果你想使用数据库来解决这类问题,你可以定义一个为你做这个的函数,或者你可以这样做:

DECLARE @t TABLE (_from CHAR(1), _to CHAR(1), _order int);

INSERT INTO @t
        ( _from, _to, _order )
VALUES 
('%','P',1),
('$','D',2)


DECLARE @inp VARCHAR(20) = '%EN$ANT';

WITH cte AS (

    SELECT REPLACE(@inp,_from,_to)  replacement, _order FROM @t WHERE _order = 1
    UNION ALL

    SELECT REPLACE(replacement, _from,_to) , [@t]._order FROM cte
    JOIN  @t ON [@t]._order = cte._order+1
)
SELECT TOP 1 replacement 
FROM cte replacement
ORDER BY _order desc

结果:

replacement
PENDANT

_order并不重要,它只是确保我们一次更换一次。