You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

高效实现PL/SQL函数:检测字符串单向字符转换差异

高效PL/SQL实现字符串差异验证

要满足需求且避免循环带来的性能问题,可以利用Oracle内置字符串函数(TRANSLATE、REPLACE、REGEXP_LIKE)实现无循环的高效验证,核心思路是:

  1. 先校验两个字符串长度是否一致(长度不同直接返回不合法)
  2. 提取两个字符串的差异字符,分别验证差异是否仅为允许的替换对:即SEARCH_STRING的差异字符只能是SEARCH_CHAR,CHECK_STRING的差异字符只能是CHECK_CHAR

实现代码

CREATE OR REPLACE FUNCTION validate_string_diff(
    p_search_string IN VARCHAR2,
    p_check_string  IN VARCHAR2,
    p_search_char   IN CHAR,
    p_check_char    IN CHAR
) RETURN NUMBER IS
    v_s_diff VARCHAR2(32767);
    v_c_diff VARCHAR2(32767);
BEGIN
    -- 长度不一致直接返回0(不合法)
    IF LENGTH(p_search_string) != LENGTH(p_check_string) THEN
        RETURN 0;
    END IF;
    
    -- 提取SEARCH_STRING中与CHECK_STRING不同的字符(过滤掉相同部分)
    v_s_diff := REPLACE(TRANSLATE(p_search_string, p_check_string, RPAD(CHR(1), LENGTH(p_check_string), CHR(1))), CHR(1));
    -- 验证差异字符是否全为SEARCH_CHAR(或无差异)
    IF v_s_diff IS NOT NULL AND NOT REGEXP_LIKE(v_s_diff, '^' || p_search_char || '*$') THEN
        RETURN 0;
    END IF;
    
    -- 提取CHECK_STRING中与SEARCH_STRING不同的字符(过滤掉相同部分)
    v_c_diff := REPLACE(TRANSLATE(p_check_string, p_search_string, RPAD(CHR(1), LENGTH(p_search_string), CHR(1))), CHR(1));
    -- 验证差异字符是否全为CHECK_CHAR(或无差异)
    IF v_c_diff IS NOT NULL AND NOT REGEXP_LIKE(v_c_diff, '^' || p_check_char || '*$') THEN
        RETURN 0;
    END IF;
    
    -- 所有校验通过返回1(合法)
    RETURN 1;
END validate_string_diff;
/

代码说明

  • TRANSLATE(p_search_string, p_check_string, RPAD(CHR(1), ...)):将SEARCH_STRING中与CHECK_STRING相同的字符替换为CHR(1)(一个不常见的控制字符,避免与业务字符冲突)
  • REPLACE(..., CHR(1)):去掉所有CHR(1),剩下的就是两个字符串的差异字符
  • REGEXP_LIKE(v_s_diff, '^' || p_search_char || '*$'):确保差异字符仅由SEARCH_CHAR组成(包括空字符串,即无差异的情况)

测试示例

示例1

SELECT validate_string_diff('AA BB AA BAC', 'AA CC AA BAC', 'B', 'C') FROM dual;
-- 返回值:1(合法)

示例2

SELECT validate_string_diff('NGUYEN THI THU THUY THI', 'NGUYEN THU THU THUY THI', 'I', 'U') FROM dual;
-- 返回值:1(合法)

非法场景测试

-- 差异字符包含非目标字符
SELECT validate_string_diff('AA BB AA BAC', 'AA DD AA BAC', 'B', 'C') FROM dual;
-- 返回值:0(不合法)

内容的提问来源于stack exchange,提问作者Duc Do

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:52:04