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

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

关键优化说明

  1. 正则表达式调整:
    • \m 和 \M:精准匹配单词的开头和结尾,避免误匹配包含关键字的其他词汇(比如SELECTED)
    • (?:...):使用非捕获分组包裹关键字列表,只捕获我们需要的目标单词,不会产生多余的NULL值
    • \s+:匹配一个或多个空格,兼容关键字后有多个空格的场景
    • (\S+):捕获关键字后的首个非空格字符串,也就是你需要的目标单词
  2. 模式参数:添加gi参数,g实现全局匹配所有符合条件的内容,i忽略大小写,支持匹配Select、Join这类大小写混合的关键字
  3. 移除无效NULL:通过非捕获分组只保留目标单词的捕获组,unnest后不会再出现大量无效NULL

原查询的问题分析

  • 原正则每个关键字分支单独设置捕获组,未匹配的分支会返回NULL,unnest后生成大量无效值
  • 原正则用([^ ]+)的写法,要求关键字前后必须有空格,无法匹配文本开头的关键字(比如示例中的Select)
  • 未开启大小写不敏感模式,无法兼容大小写混合的关键字写法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:30:44