【问题标题】:PostgreSQL: How to find out which where clause failedPostgreSQL:如何找出哪个 where 子句失败
【发布时间】:2020-04-27 21:25:30
【问题描述】:

考虑一个包含以下列的属性表:

id, address, no_of_bedrooms, no_of_bathrooms, garage_size

并考虑包含以下列的投资者表:

id, name, no_of_bedrooms, no_of_bathrooms, garage_size

为了简单起见,假设投资者正在寻找一个完全匹配的 no_of_bedrooms、no_of_bathrooms、garage_size 房产。

现在,我可以运行查询以返回将购买特定房产的投资者列表。

我想知道的是,我是否可以使用 PSQL 来找出哪些投资者对某个房产不感兴趣,以及该房产对每个投资者的哪些特定属性不感兴趣?

例如,假设有一个 1 房 1 卫的房产,4 位投资者要求最低 2 房 2 卫的房子。我可以运行什么查询来提供以下输出?

property_id, investor_id, rejected_column_name

在上面的结果中,一个投资者可以有超过 1 行,这意味着一个属性被特定投资者拒绝的原因不止一个。

这甚至可以用 SQL/PSQL 实现吗?

【问题讨论】:

  • 属性数据准确。但我们如何知道投资者数据是小于、强制等于还是大于该值?
  • @GordonLinoff 更新了问题。为简单起见,假设它是完全匹配的。

标签: sql postgresql psql


【解决方案1】:

我建议先取消透视,然后在属性级别加入:

with ip as (
      select i.*, v.*
      from investors ip cross join lateral
           (values ('no_of_bedrooms', no_of_bedrooms),
                   ('no_of_bathrooms', no_of_bathrooms),
                   ('garage_size', garage_size)
           ) v(prop, val)
     ),
     pp as (
      select i.*, p.*
      from properties ip cross join lateral
           (values ('no_of_bedrooms', no_of_bedrooms),
                   ('no_of_bathrooms', no_of_bathrooms),
                   ('garage_size', garage_size)
           ) v(prop, val)
    )
select ip.id, ip.name, pp.prop, ip.val, ip.name
from pp join
     ip
     on pp.prop = ip.prop 
where pp.id = ? and and pp.val <> ip.val;

这假定属性都是字符串。如果有其他类型,可以用::text进行转换。

【讨论】:

    猜你喜欢
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2013-01-15
    • 2016-03-30
    相关资源
    最近更新 更多