Redshift中如何精准筛选含SQL文本列内指定表名的行?
Redshift中精准匹配表名的问题解决
问题根源
- 第一个查询
ColumnB like '%dly_demand_fcst_all'返回0行:目标表名dly_demand_fcst_all在SQL脚本文本里通常不会是整列的结尾——它前面可能带schema(比如schema.dly_demand_fcst_all),后面可能跟着空格、括号、逗号或者SQL关键字(比如FROM dly_demand_fcst_all WHERE),所以结尾匹配的逻辑完全命中不到有效行。 - 第二个查询
ColumnB like '%dly_demand_fcst_all%'返回全部三行:第三行的dly_demand_fcst_all_output包含了dly_demand_fcst_all这个子串,LIKE的模糊匹配只会检查是否包含该子串,不会判断这是不是一个独立的表名,因此误把带后缀的表名也匹配进来。
解决方案:用正则精准匹配独立表名
Redshift支持REGEXP_LIKE函数,可以通过正则表达式确保dly_demand_fcst_all是一个独立的标识符,周围是SQL语法里的分隔符(比如点、空格、括号、逗号,或者文本首尾)。
基础版查询
SELECT * FROM your_table_name WHERE REGEXP_LIKE(ColumnB, '\bdly_demand_fcst_all\b')
这里的\b是单词边界,能匹配表名前后的非字母数字/下划线字符,比如:
- 匹配
FROM dly_demand_fcst_all - 匹配
schema.dly_demand_fcst_all - 不匹配
dly_demand_fcst_all_output
兼容带引号的表名场景
如果SQL脚本里的表名有用双引号或反引号包裹的情况,可以用扩展正则:
SELECT * FROM your_table_name WHERE REGEXP_LIKE(ColumnB, '([^a-zA-Z0-9_]|^)["`]?dly_demand_fcst_all["`]?([^a-zA-Z0-9_]|$)')
这个正则会匹配:
- 表名前后的非字母数字/下划线字符,或者文本的开头/结尾
- 允许表名被双引号或反引号包裹的情况
内容的提问来源于stack exchange,提问作者KKP
相关产品推荐
相关产品推荐

