我有一个表格,其中包含每个市场的产品优先级,如果未定义市场,则默认优先级为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?
非常感谢您的帮助!
答案 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
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。