我试图跟踪博客网站上的评论来源,而我的问题涉及使用OR
语句在多个列上优先加入JOIN。
评论表:
Column | Type
--------------------+-------------------------
id | integer
text | character varying(1024)
session_source_id | integer
user_source_id | integer
如果我有这样的查询:
SELECT s.type, COUNT(c.id) FROM comments c
LEFT JOIN sources s ON (c.session_source_id = s.id OR c.user_source_id = s.id)
GROUP BY 1;
在某些情况下我们知道用户来源但不知道会话来源(这就是我使用OR
的原因),但我想优先考虑session_source_id 如果我们还有user_source_id 和这两个ID不同。
(在某些情况下,我们不知道任何来源,两列都为空,因此LEFT JOIN
)
该查询是否优先考虑session_source_id上的JOIN,因为它在加入OR
语句中首先列出? Postgres如何处理JOIN语句中的OR条件?
答案 0 :(得分:2)
使用OR
不会优先考虑条件,如果两个条件都为真,则返回两个记录。
如果你想要任何优先权,你可以使用CASE EXPRESSION
来打破满足条件的那一刻:
SELECT s.type, COUNT(c.id) FROM comments c
LEFT JOIN sources s
ON (CASE WHEN c.session_source_id = s.id THEN 1
WHEN c.user_source_id = s.id THEN 1
ELSE 0
END = 1)
GROUP BY 1;
答案 1 :(得分:1)
将GarethD的评论作为答案和Wiki发布,以免失败:
尝试使用COALESCE代替OR ...
bounds = TextBuilder.create().text(string).font(m_Font).build().getLayoutBounds();