PostgreSQL函数无显式JOIN多表查询及REGEXP_SPLIT_TO_TABLE疑问
问题一解答:多表查询未写显式JOIN的实现原理
你看到的是SQL标准支持的隐式内连接写法:
- 语法上只要在
FROM子句后用逗号分隔所有需要关联的表,再在WHERE子句中写明表与表之间的关联匹配条件即可,等价于显式写INNER JOIN ... ON的效果 - 你这段代码里的关联逻辑对应的显式JOIN写法如下,和原代码执行效果完全一致:
FROM application_license l INNER JOIN districts d ON case when l.service_code in(1,2,18,19) then l.firm_district else l.district_code end = d.district_code INNER JOIN blocks b ON case when l.service_code in(1,2,18,19) then l.firm_taluk else l.taluk_code end = b.block_code INNER JOIN mst_license s ON l.ack_no = s.ack_no INNER JOIN mst_services m ON m.service_code = l.service_code
- 这种写法是SQL-89标准的旧写法,现在更推荐使用显式JOIN语法,可读性更强,也能避免漏写关联条件导致产生笛卡尔积的问题。
问题二解答:REGEXP_SPLIT_TO_TABLE的作用
REGEXP_SPLIT_TO_TABLE是PostgreSQL官方内置的集返回函数(Set-Returning Function, SRF),不是用户自建的表/视图,不需要你手动创建:
- 它的作用是接收一个字符串和正则分隔符,将字符串按分隔符拆分后返回多行结果,每一行对应拆分后的一个子串
- 你这段代码里的用法是把逗号拼接的许可等级字符串
p_license_grade按逗号拆成多行,比如当传入的license_grade1 = 'A'且service_code1 =1时,p_license_grade的值为SG,C1,C2,C3,经过REGEXP_SPLIT_TO_TABLE(p_license_grade, ',')处理后会返回4行记录,值分别是SG、C1、C2、C3,用来给IN子句做过滤条件,匹配所有属于这几个等级的许可记录。 - 如果你的PostgreSQL版本较低找不到这个函数,可以使用功能更基础的
STRING_TO_TABLE函数替代,用法完全一致,只是后者只能用固定字符串做分隔符,不支持正则匹配,你这个场景下用STRING_TO_TABLE效果完全相同。
内容的提问来源于stack exchange,提问作者cosmokrick
相关产品推荐
相关产品推荐

