PostgreSQL LIKE子查询关联Branch与Balance表的查询方案咨询
解决PostgreSQL后缀匹配查询问题
嘿,我来帮你搞定这个匹配需求!你的问题核心是要找到Balance表中name恰好是Branch表某条记录name末尾部分的行,之前的查询语句没成功主要是逻辑方向反了,而且子查询的用法也有问题。
为什么原语句失败?
你写的select * from Balance where name like ( SELECT name FROM Branch );有两个明显问题:
- 子查询
SELECT name FROM Branch会返回多行结果,直接用like会抛出子查询返回多于一行的错误; - 逻辑完全搞反了:你需要判断
Branch.name是否以Balance.name结尾,而不是Balance.name匹配Branch.name。
可行方案1:用LIKE通配符+JOIN关联
这是最直观的写法,通过字符串拼接把Balance.name转化为后缀匹配的模式:
SELECT b.* FROM Balance b INNER JOIN Branch br ON br.name LIKE '%' || b.name;
'%' || b.name会把Balance的name变成%ABC这样的通配符模式,匹配所有以该字符串结尾的Branch.name;INNER JOIN只会保留两边都匹配上的Balance行,正好符合你的需求。
可行方案2:用RIGHT()函数精确匹配后缀
如果想要更严谨的匹配(避免因通配符可能带来的意外匹配,比如Branch.name是XYZABC而Balance.name是ABC这种场景其实也符合需求,但这个方法逻辑更直接),可以用RIGHT()提取Branch.name的末尾字符,和Balance.name直接对比:
SELECT b.* FROM Balance b INNER JOIN Branch br ON RIGHT(br.name, LENGTH(b.name)) = b.name;
LENGTH(b.name)获取Balance中当前行name的长度;RIGHT(br.name, 长度)提取Branch.name对应长度的末尾字符串,和b.name做相等判断,逻辑精准。
测试验证
用你给出的测试数据:
- Branch表数据:
123456ABC、553646DEF - Balance表数据:
ABC、DEF
两个方案都会返回Balance表中的两行,完全符合预期。
内容的提问来源于stack exchange,提问作者thekucays
相关产品推荐
相关产品推荐

