高效实现PL/SQL函数:检测字符串单向字符转换差异
高效PL/SQL实现字符串差异验证
要满足需求且避免循环带来的性能问题,可以利用Oracle内置字符串函数(TRANSLATE、REPLACE、REGEXP_LIKE)实现无循环的高效验证,核心思路是:
- 先校验两个字符串长度是否一致(长度不同直接返回不合法)
- 提取两个字符串的差异字符,分别验证差异是否仅为允许的替换对:即
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
相关产品推荐
相关产品推荐

