使用OR

时间:2016-10-31 15:26:28

标签: sql postgresql join

我试图跟踪博客网站上的评论来源,而我的问题涉及使用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条件?

2 个答案:

答案 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();