【问题标题】:CASE with EXISTS query in SQlite returns wrong resultSQlite 中带有 EXISTS 查询的 CASE 返回错误结果
【发布时间】:2016-06-01 22:28:41
【问题描述】:

我有 2 个模型:

  • 产品 - 产品列表及其价格
  • 优惠 - 产品可以有 0...n 个不同的优惠

表格结构:

Table [shop_product]
    Fields: 10
        [id]: integer NOT NULL
        [name]: varchar(300) NOT NULL
        [slug]: varchar(150) NOT NULL
        [description]: text NOT NULL
        [photo]: varchar(100) NOT NULL
        [price]: decimal NOT NULL
        [category_id]: integer NOT NULL
        [upload_date]: datetime NOT NULL
        [is_enabled]: bool NOT NULL
        [info_template_id]: integer

Table [shop_productoffer]
    Fields: 6
        [id]: integer NOT NULL
        [price]: decimal NOT NULL
        [description]: text NOT NULL
        [offer_attribute_id]: integer NOT NULL
        [product_id]: integer NOT NULL
        [default_offer]: bool NOT NULL
    Foreign Keys:
        [] ([product_id]) REFERENCES [shop_product]([id])

我想构建一个查询,该查询返回产品列表并通过以下逻辑显示“default_price”字段: 如果产品有报价 --> 显示最低的相关报价 否则显示产品的价格字段

这是我得到的(SQlite3 查询):

SELECT
product.price,
CASE offer.price
    WHEN EXISTS(SELECT  * FROM shop_productoffer
                WHERE shop_productoffer.product_id = product.id)
    THEN (SELECT MIN(price) FROM shop_productoffer
        WHERE shop_productoffer.product_id = product.id AND
        shop_productoffer.default_offer = 1)
    ELSE product.price
END AS 'default_price'
FROM shop_product as product
LEFT JOIN shop_productoffer AS offer ON product.id = offer.product_id

看起来,Exists 条件永远不会满足 - 查询始终将 default_price' 值返回为 product.price。有些产品与优惠相关联,有些则没有,但结果始终相同。

我做错了吗? 这是一个非常简单的查询,但我无法使其工作

【问题讨论】:

  • 能否分享一下表格的结构、一些示例数据以及您想要得到的结果?

标签: sql sqlite case exists


【解决方案1】:

一种更简单的方法可能是使用聚合查询来生成最低报价并将left join 提供给product 表:

SELECT    p.name, COALESCE(o.default_price, p.price) AS default_price
FROM      shop_product p
LEFT JOIN (SELECT   product_id, MIN(price) AS default_price
           FROM     shop_prodcutoffer
           WHERE    default_offer = 1
           GROUP BY product_id) o ON p.id = o.product_id

【讨论】:

  • 你的方法很好,我想知道为什么我的方法不行。似乎从未满足 WHEN 条件 - 我尝试设置一些琐碎的 WHEN ("TRUE") 条件,但结果始终来自 "ELSE" 块。
  • @Ofir 您的方法应该有效,但是您使用的语法不正确-您有case price when ...-这意味着您将尝试将when 子句的值与行的@987654326 进行比较@value - 可能永远不会是true,而是一些十进制值。我想你的意思是使用case /* note no price here! */ when exists (select...) then (select...) else product.price end
猜你喜欢
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多