PostgreSQL使用like的子查询

5
假设我有一个第一张表格,像这样: 分支机构表
|name     |description|
|123456ABC|FOO        |
|553646DEF|FO2        |

还有第二个表格,就像这样

结算表格

|name|description|
|ABC |oof        |
|DEF |2of        |

我希望查询余额表,其中每一行都包含分支机构表中的名称.. 例如,分支机构表中的“123456ABC”,我想从余额表中获取“ABC”行。
我该如何实现?到目前为止,我已经尝试了以下查询,但没有成功。
select * from Balance
where name like (
        SELECT `name` FROM Branch
);

有什么建议吗?

它是否总是最后3个字符,还是名称在余额中长度可能会不同? - Gary - Stand with Ukraine
2个回答

6
你应该将balance的名称转换为LIKE模式:
SELECT * FROM Balance
WHERE (
    SELECT `name` FROM Branch
) LIKE '%' || name;

使用Join可以让代码更易读:

SELECT b.* FROM Balance b JOIN Branch r ON r.name LIKE '%' || b.name;

我使用了join方法。非常好用!谢谢! - thekucays

2

我不知道你是否会有重复项,因此你可能需要考虑使用半连接。对于大型数据集,半连接通常比in-list查询更有效率。

@clemens的解决方案很好,假设没有重复项。或者,你可以使用正则表达式:

select *
from balance ba
where exists (
  select null
  from branch br
  where
    br.name ~ ba.name
)

就性能而言,我认为 like 会比正则表达式更快,但这是一个选项。

另外,如果你的字符串总是在结尾,你可以考虑使用 rightsubstr 进行连接:

select *
from balance ba
where exists (
  select null
  from branch br
  where
    right (br.name, length (ba.name)) = ba.name
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接