【问题标题】:Query for conditions across rows跨行查询条件
【发布时间】:2015-07-07 07:55:27
【问题描述】:

我有一张这样的桌子

id |   item |  price | vip
---+--------+--------+-----
0  |  tv    | 2000   | NULL
1  |  tv    | 2500   | TRUE
2  |  camera| 3000   | NULL
3  |  camera| 3500   | TRUE
4  |  phone | 1000   | NULL
5  |  pen   | 2      | NULL

在这个表中,我有一些重复的条目,因为我需要存储 vip 价格。如果正常人来访,我需要出示

item  | price
------+---------
tv    | 2000
camera| 3000
phone | 1000
pen   | 2

如果贵宾来了,那么我应该显示价格

item  |  price
------+-----------
tv    | 2500
camera| 3500
phone | 1000
pen   | 2

最后一列是布尔值。

我需要查询来获取项目。请帮忙查询这个。

【问题讨论】:

  • 为什么同时使用 MySQL 和 Postgresql 标签?
  • 我正在使用 Postgresql,但我认为这是很常见的事情,两种类型的数据库的查询应该相同。我可能错了!
  • 查询是否适用于其他数据库无关紧要,不要标记未涉及的产品。
  • @NarendraSisodiya :你想同时显示pen 吗?
  • @Ullas - 是的,应该同时显示笔......

标签: sql postgresql postgresql-9.4


【解决方案1】:

普通客户:

select item, price
from tablename
where vip is NULL

贵宾客户:

select item, price
from tablename t1
where vip is true
   or not exists (select 1 from tablename t2
                  where t1.item = t2.item
                    and vip is true)

【讨论】:

    【解决方案2】:

    你只需要一个 WHERE 子句

     SELECT price from *** WHERE ((VarVip = true AND vip IS NOT NULL) OR (vip IS NULL)) and item = ...
    

    我无法测试它,但它应该打印 VIP 价格(如果存在),否则打印正常价格。如果没有(我怀疑),您仍然可以在 where 子句中添加这样的测试:

    exists(SELECT price from *** where vip IS NOT NULL and item = ...)
    

    【讨论】:

    • 不,这不起作用,'vip' 列标志不是唯一的标准。
    • 看,为了打印贵宾价格,我需要检查给定物品的贵宾价格是否存在?如果存在贵宾价格,则使用该价格,否则使用正常价格..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多