在 Oracle 中将字符 B 替换为 V,反之亦然,Z 替换为 S,反之亦然

Posted

技术标签:

【中文标题】在 Oracle 中将字符 B 替换为 V,反之亦然,Z 替换为 S,反之亦然【英文标题】:Replace characters B for V and vice versa, Z for S and vice versa in Oracle 【发布时间】:2019-12-27 21:56:22 【问题描述】:

我需要替换字符。 B 代表 V,反之亦然,Z 代表 S,反之亦然 在甲骨文中

DECLARE
lc_word_so    VARCHAR2 (500);
lc_word_lst   VARCHAR2 (500);
lc_word       VARCHAR2 (500) := 'VBZ';
ln_length     NUMBER         := LENGTH (lc_word);
lc_search     VARCHAR2 (2);
lc_replace    VARCHAR2 (2);

TYPE typ_search IS VARRAY (6) OF VARCHAR2 (1);
arr_search    typ_search := typ_search ('B','V','S','Z');
BEGIN
IF ln_length > 0 THEN
    lc_word_so := NULL;

    FOR i IN 1 .. arr_search.COUNT LOOP
        IF MOD (i, 2) = 0 THEN
            lc_search := arr_search (i);
            lc_replace := arr_search (i - 1);
        ELSE
            lc_search := arr_search (i);
            lc_replace := arr_search (i + 1);
        END IF;

        FOR j IN 0 .. ln_length LOOP
            lc_word_lst := lc_word_so;
            lc_word_so := REGEXP_REPLACE (lc_word, lc_search, lc_replace, 1, j, 'i');

            IF lc_word_so = lc_word THEN
                EXIT;
            ELSE
                IF (lc_word_lst IS NULL OR lc_word_lst != lc_word_so) THEN
                    DBMS_OUTPUT.put_line (lc_word_so);
                END IF;
            END IF;
        END LOOP;
    END LOOP;
END IF;
END;

我期望输出: 论坛 BBZ BVS BVZ VBS VBZ VVS VVZ

但实际输出是: VVZ BBZ 微博

【问题讨论】:

【参考方案1】:

您可以使用内置功能来做到这一点。 translate() 函数将第一个模式中的字符 -'BVSZ' - 替换为第二个模式中相同偏移量的字符 - 'VBZS'。第一个模式中未包含的字符将被忽略:

with cte as (
    select 'BNV' as str from dual union all
    select 'ZXS' as str from dual union all
    select 'BBS' as str from dual
    )
select str
       ,translate(str, 'BVSZ', 'VBZS') as trns
from cte

【讨论】:

好吧,也许某个好心人会花时间为您调试代码。我对 Oracle 内置插件的低效替代品不感兴趣。比重新发明***更糟糕的一件事是重新发明方形。【参考方案2】:

这是使用translate的解决方案,但看起来不专业:

SELECT TRANSLATE ('VBZ', 'B', 'V') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'V', 'B') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'S', 'Z') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'Z', 'S') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'BV', 'VB') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'VB', 'BV') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'SZ', 'ZS') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'ZS', 'SZ') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'BS', 'VZ') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'VZ', 'BS') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'SB', 'ZV') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'ZV', 'SB') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'BV', 'VB') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'VBZ', 'BVS') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'VZS', 'BSZ') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'BZS', 'VSZ') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'BVZS', 'VBSZ') FROM DUAL UNION SELECT TRANSLATE ('VBZ', 'VBZS', 'BVSZ') FROM DUAL

【讨论】:

以上是关于在 Oracle 中将字符 B 替换为 V,反之亦然,Z 替换为 S,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将数字转换为字符串,反之亦然

在Python中将字符转换为int,反之亦然

如何在现有文件中将制表符转换为空格,反之亦然

如何在 Qt 中将 QVariant 转换为 QString,反之亦然?

Oracle替换第一个字符

ORACLE SQL:如何在 Pivot 函数中将 NULL 替换为 0