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

Oracle SQL需求:提取列中非标准字符以规范插入模板允许值

提取列中非标准字符的解决方案

1. 定位包含非标准字符的记录

你原SQL的逻辑是筛选符合标准规则的记录,要找反例(含非标准字符的记录),需要用NOT REGEXP_LIKE,同时注意补全正则的引号(语法要求):

SELECT column_1 FROM mytable 
WHERE NOT REGEXP_LIKE(column_1, '^[a-zA-Z0-9-]+$')

这条语句会返回所有包含标准字符(a-z、A-Z、0-9、连字符)以外内容的记录。

2. 提取所有出现过的非标准字符

如果要单独列出所有存在的非标准字符(比如$%()*这类),可以用以下方式实现(以Oracle为例,不同数据库语法略有调整):

WITH chars AS (
    SELECT DISTINCT SUBSTR(column_1, LEVEL, 1) AS non_std_char
    FROM mytable
    WHERE NOT REGEXP_LIKE(column_1, '^[a-zA-Z0-9-]+$')
    CONNECT BY LEVEL <= LENGTH(column_1)
    AND PRIOR column_1 = column_1
    AND PRIOR SYS_GUID() IS NOT NULL
)
SELECT non_std_char
FROM chars
WHERE NOT REGEXP_LIKE(non_std_char, '[a-zA-Z0-9-]')
ORDER BY non_std_char;

逻辑说明:

  • 递归CTEchars会把所有含非标准字符的字段拆成单个字符
  • 最后过滤掉标准字符,剩下的就是所有出现过的非标准字符

其他数据库适配示例

  • PostgreSQL:用字符串拆分函数更简洁
SELECT DISTINCT unnest(regexp_split_to_array(column_1, '')) AS non_std_char
FROM mytable
WHERE column_1 !~ '^[a-zA-Z0-9-]+$'
AND unnest(regexp_split_to_array(column_1, '')) !~ '[a-zA-Z0-9-]'
ORDER BY non_std_char;
  • MySQL:用数字辅助表实现拆分逻辑,替换REGEXP_LIKE为REGEXP

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:55:19