2016-01-20 88 views
0

我有一个表格,每个市场都有产品优先级,并且市场没有被定义为market = NULL的默认优先级。例如:MySQL SELECT CASE或IF查询

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

我需要一个查询,给了我这个市场是没有在表中,然后用市场的默认值=空定义为一个特定市场,但在所有的情况下优先考虑的产品。当我使用WHERE market = 'DE' OR market IS NULL时,我同时得到了DE和NULL的条目,但是如何使用WHERE子句仅在配置时才获取DE?

非常感谢您的帮助!

+1

为什么不使用WHERE market ='DE',我没有得到确切的问题 –

+0

换句话说,你总是想要返回所有不同的产品和它们的优先级,但是当市场上没有产品时定义,您想要使用来自市场的默认产品和优先级。 – xQbert

+0

我总是问某个市场。对于DE,优先级被定义。例如,当我使用'ES'时,查询应该返回market = null(默认值)的条目。通常我使用'WHERE col ='xy'或者col IS NULL ORDER BY col DESC LIMIT 1',但它仅适用于每个值'col'只有一行的表格。在这种情况下,每个市场的行数可能不同。 – naptoon

回答

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表存在,聚结,确保返回的值在B表。

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

如市场对美国“..

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

这可能是也可能不是你追求的。因为它会为市场返回额外的产品。

但是,如果在没有定义市场的市场存在的情况下,您是在空市场之后,那么需要采用不同的方法。

由于我们无法比较NULL值(NULL = 'DE')不起作用,因此null值导致一些挑战。因此,如果我们将NULL值转换为我们可以比较的值,那么这将成为一个简单的where子句评估。所以这个假设'#$'永远不会显示为市场价值。尽管这很不方便。

检测过

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子句使用所提供的“期望市场”价值。如果不是空的话,我就不需要补一个价值,也不会觉得自己有点ha。。

+0

这看起来几乎完美,但对于'美国'市场,应该只有产品和美国市场的价值(没有NULL行) – naptoon

+0

我试过了一种完全不同的方法。这里的问题是我们不知道提供的价值是否在市场清单中。所以直到我们知道我们知道两个市场(无效的和想要的)必须被考虑。因此,计数来查看它是否存在,然后根据市场是否存在或不存在的逻辑来返回正确的一个。 – xQbert

+0

最后一个查询适合我,非常感谢! – naptoon