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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:56:58