我正在尝试搜索包含来自另一个表的信息的字段。我尝试了以下查询:
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
像目前接受的答案所建议的那样,加入表通常不是您想要的。这里的问题并不完全清楚。
如果other_text
包含4、9、15和94,那么在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||'%';
我更喜欢第一种形式,因为它使我更清楚发生了什么。