使用CASE或IF的MySQL SELECT查询

时间:2016-01-20 14:52:51

标签: mysql if-statement case where

我有一个表格,其中包含每个市场的产品优先级,如果未定义市场,则默认优先级为market = NULL。例如:

market - product_id - priority NULL - 101 - 1 NULL - 201 - 2 NULL - 103 - 3 DE - 101 - 2 DE - 103 - 1 DE - 201 - 3 US - 101 - 1 US - 103 - 2

我需要一个查询,它给出了给定市场的所有产品优先级,但是如果表中未定义该市场,则使用market = null的默认值。当我使用WHERE market = 'DE' OR market IS NULL时,我得到两个,DE和NULL的条目,但是如果配置了WHERE子句如何只获取DE?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

假设您希望始终返回相同的主产品集的一种方法......

 SELECT coalescce(B.market,A.Market) as Market
         , coalesce(B.product_Id, A.Product_ID) as Product_ID
         , coalesce(B.priority, A.Priority) as Priority
    FROM table A
    LEFT JOIN table B
     on A.Product_ID = B.Product_ID
    and A.Market is null
    WHERE B.Market = 'DE'

market - product_id - priority
DE     - 101        - 2
DE     - 103        - 1
DE     - 201        - 3

由于DE存在于表中,因此coalesce确保返回B表值。

但是,如果产品存在于NULL但不在市场中 将返回具有该product_Id和来自A的优先级的NULL市场。

如市场'美国'..

NULL - 201 - 2
US   - 101 - 1
US   - 103 - 2

您可能会或可能不会追求什么。因为它为市场返回额外的产品。

但是,如果定义市场不存在市场,那么您将进入NULL市场,那么需要采用不同的方法。

null值导致一些挑战,因为我们无法在相等(NULL = 'DE')中比较NULL不起作用。因此,如果我们将NULL值转换为一个我们可以比较的值,那么这将成为一个简单的where子句评估。所以这个假设'#$'绝不会作为市场价值出现。这是相当讨厌的。

TESTED

SQL FIDDLE ES

SQL FIDDLE US

Select * 
from table
where coalesce(market,'#$') = 
      case when (Select count(*) 
                 from table 
                 where market = 'ES') > 0 then 'ES' else '#$' end 

因此,我能想到的最简洁的方法是一个程序,它只是首先检查“所需市场”的计数,如果为0则where子句为空,如果不为0则where子句使用“期望的市场”值。如果不是null,我就不必编造一个值,也不会感觉像是hackish。