如何用PostgreSQL正则过滤指定表并实现记录去重
解决方案
正则匹配规则
用负向后行断言排除schema以_inc结尾的表,正则表达式如下:
^[a-z0-9_]+(?<!_inc)\.[a-z0-9_]+$
^[a-z0-9_]+:匹配schema部分的合法字符(PostgreSQL标识符允许字母、数字、下划线)(?<!_inc):负向后行断言,确保schema的结尾不是_inc\.[a-z0-9_]+$:匹配表名部分,以点号分隔,直到字符串结尾
PostgreSQL 实现示例
假设你已通过正则提取出所有表名记录,可通过以下SQL完成过滤+去重:
SELECT DISTINCT table_name FROM ( -- 替换成你原本提取表名的查询语句 SELECT unnest(regexp_matches(your_sql_content, '\b([a-z0-9_]+\.[a-z0-9_]+)\b', 'g')) AS table_name ) extracted_tables WHERE table_name ~ '^[a-z0-9_]+(?<!_inc)\.';
regexp_matches配合g标志提取所有匹配的表名,unnest将数组转为行记录WHERE子句用正则过滤掉schema带_inc后缀的记录DISTINCT直接对剩余表名去重,保留唯一记录
补充说明
- 如果SQL中存在大小写混合的标识符,需在正则中加入
i标志(如'gi'),或调整正则为^[A-Za-z0-9_]+(?<!_inc)\.[A-Za-z0-9_]+$ - 若表名包含双引号包裹的特殊字符,需要调整正则适配,但PostgreSQL常规标识符一般仅包含字母、数字、下划线
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

