获取字段包含来自不同表中列的文本的行?



我正在尝试搜索包含来自另一个表的信息的字段。我尝试了以下查询:

SELECT * 
FROM table_1 
WHERE text_field LIKE '%'||(SELECT other_text FROM table_2)||'%';
SELECT * 
FROM table_1 
WHERE text_field ~* '(SELECT other_text FROM table_2)';

不幸的是,我得到:

ERROR:作为表达式使用的子查询返回的多行

示例表:

table_1

text_field12秒内完成两个事务5秒内完成一个事务94秒内创建15条记录,删除4条记录

像目前接受的答案所建议的那样,加入表通常不是您想要的。这里的问题并不完全清楚。

如果other_text包含491594,那么在94秒内创建15条记录和删除4条记录的行将在结果中列出四次。使用EXISTS相反,要获得不同的结果行:

SELECT t1.*
FROM   table_1 t1 
WHERE  EXISTS (SELECT FROM table_2 t2 WHERE t1.text_field ~ t2.other_text)
ORDER  BY t1.id;  -- optional

如果有多个重复匹配,速度也会更快。

相关:

  • Postgres中LIKE和~的区别

如果other_text可以包含LIKE或regexp匹配~的特殊字符(无论您使用哪个),您可能需要转义它们:

  • 正则表达式或LIKE模式的转义函数

旁白:是的,那是一个"join":

SELECT * FROM a,b WHERE a.x LIKE b.y;

它是

的孪生体,可读性较差
SELECT * FROM a JOIN b ON a.x LIKE b.y;

:

  • [FROM x, y]在Postgres中是什么意思?

使用CTE(Common Table Expression)

WITH ot as(
SELECT other_text FROM table_2)
SELECT * 
FROM ot, table_1 
WHERE text_field LIKE '%'|| ot.other_text||'%';

为了完整,我应该提到你可以把它缩短为:

SELECT * 
FROM table2, table_1 
WHERE text_field LIKE '%'|| table2.other_text||'%';

我更喜欢第一种形式,因为它使我更清楚发生了什么。

相关内容

  • 没有找到相关文章

最新更新