Oracle SQL查找含ASCII 49828特殊字符的值并替换为普通空格的方法
查找包含ASCII 49828特殊字符的字段值
Oracle中可以通过CHR()函数将ASCII码转换为对应字符,直接匹配即可,不需要硬编码特殊字符避免编码兼容问题:
- 单表指定列查询:
SELECT * FROM 你的表名 WHERE INSTR(你的列名, CHR(49828)) > 0;
- 如果需要批量排查多个表的多个字段,可以通过动态SQL实现,示例如下:
DECLARE v_search_char CHAR(1) := CHR(49828); v_count NUMBER; BEGIN FOR rec IN (SELECT table_name, column_name FROM user_tab_columns WHERE data_type IN ('CHAR', 'VARCHAR2', 'CLOB')) LOOP EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||rec.table_name||' WHERE INSTR('||rec.column_name||', :1) > 0' INTO v_count USING v_search_char; IF v_count > 0 THEN DBMS_OUTPUT.PUT_LINE('表 '||rec.table_name||' 列 '||rec.column_name||' 存在'||v_count||'条包含特殊字符的记录'); END IF; END LOOP; END; /
执行前需要先开启服务器输出:SET SERVEROUTPUT ON;
替换ASCII 49828为普通空格(ASCII 32)
- 临时查询替换(不修改原数据,仅返回清洗后的结果):
SELECT REPLACE(你的列名, CHR(49828), CHR(32)) AS 清洗后列名 FROM 你的表名;
- 永久修改原表数据:
注意:执行UPDATE前建议先备份对应数据,或者开启事务验证修改结果无误后再提交
UPDATE 你的表名 SET 你的列名 = REPLACE(你的列名, CHR(49828), CHR(32)) WHERE INSTR(你的列名, CHR(49828)) > 0; -- 验证修改无误后执行COMMIT提交 COMMIT;
如果需要批量替换多表多列的该特殊字符,可参考上面的动态SQL逻辑调整实现即可。
内容的提问来源于stack exchange,提问作者Imran Hemani
相关产品推荐
相关产品推荐

