Postgres regexp_matches:获取指定关键字后的首个单词
解决PostgreSQL中提取SQL关键字后首个单词的问题
你的原查询出现大量NULL值,核心原因是正则捕获组设计不合理,同时没处理大小写兼容和空格匹配的问题。以下是修正后的可行方案:
修正后的查询语句
with src(txt) as ( values ('Select * FROM dm.lib Update sc.qar Join ws.gys') ) select unnest(regexp_matches(txt, '\m(?:SELECT|UPDATE|JOIN|FROM|DELETE|MERGE)\M\s+(\S+)', 'gi')) as keyword_target from src;
执行后会返回预期结果:
keyword_target ---------------- * dm.lib sc.qar ws.gys
关键优化说明
- 正则表达式调整:
\m和\M:精准匹配单词的开头和结尾,避免误匹配包含关键字的其他词汇(比如SELECTED)(?:...):使用非捕获分组包裹关键字列表,只捕获我们需要的目标单词,不会产生多余的NULL值\s+:匹配一个或多个空格,兼容关键字后有多个空格的场景(\S+):捕获关键字后的首个非空格字符串,也就是你需要的目标单词
- 模式参数:添加
gi参数,g实现全局匹配所有符合条件的内容,i忽略大小写,支持匹配Select、Join这类大小写混合的关键字 - 移除无效NULL:通过非捕获分组只保留目标单词的捕获组,unnest后不会再出现大量无效NULL
原查询的问题分析
- 原正则每个关键字分支单独设置捕获组,未匹配的分支会返回NULL,unnest后生成大量无效值
- 原正则用
([^ ]+)的写法,要求关键字前后必须有空格,无法匹配文本开头的关键字(比如示例中的Select) - 未开启大小写不敏感模式,无法兼容大小写混合的关键字写法
内容的提问来源于stack exchange,提问作者Gerzzog
相关产品推荐
相关产品推荐

