【问题标题】:Logical operator ignored in Postgres commandPostgres 命令中忽略的逻辑运算符
【发布时间】:2018-08-12 23:55:15
【问题描述】:

我有一个左连接命令,它还检查连接表之间数据中的匹配字母和其他两个组合。 DISTINCT ON 是为了确保 location_plus 没有与右侧表中的结果重复。为了测试我的结果,我添加了一个 AND 来检查特定的帐号结果。这个 AND 组件似乎被完全忽略了,返回几乎所有的记录,而不是那个 a/c 号码的 ~10。这是为什么呢?

SELECT
DISTINCT ON (location_plus)
a.*,b.*
FROM schema.source_table b
LEFT JOIN schema.other_reference a
ON a.loc_id = (substring(b.loc_id,3))::integer
WHERE left(b.loc_id,1)=left(a.table_name,1)
OR ((left(b.loc_id,1)='B' AND left(a.table_name,1)='A') OR (left(b.loc_id,1)='B' AND left(a.table_name,1)='B'))
and b.account_number='12345678'

【问题讨论】:

  • 因为您在没有正确括号的情况下将ORAND 混合在一起。

标签: sql postgresql left-join logical-operators


【解决方案1】:

AND 优先于OR。所以

WHERE left(b.loc_id,1)=left(a.table_name,1)
OR (...) 
and b.account_number='12345678'

WHERE left(b.loc_id,1)=left(a.table_name,1)
OR ((...) and b.account_number='12345678')

你可能希望它在哪里

WHERE (left(b.loc_id,1)=left(a.table_name,1) OR (...))
and b.account_number='12345678'

使用如图所示的括号来解决此问题。

【讨论】:

  • 所以我的代码的最后一部分取消了命令的整个“和/或”部分,因为我打破了链条?
  • 好吧,你认为它会为整个WHERE 子句添加一个条件,但它只在OR 之后的部分添加了一个条件,因为没有括号的 AND 优先于 OR。所以附加条件并没有“取消”整个WHERE 子句;只是它不会影响您在OR 之前获得的结果行。
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 2022-01-20
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多