我有两个产品表。表A是“默认”表(来自数据源每周自动更新)。表B用于手动覆盖表A中的值,并且具有与表相同的列以及更多列。两个表始终具有相同的UniqueID列。
我需要一个select语句,它从A中提取所有值,从B中提取所有值,其中B覆盖A中的值,其中B的值为null,= 0或等于0.00(列设置为整数2个小数点并填充“0”)。
我尝试使用LEFT JOIN但是遇到了null和“0”值的问题。
我正在使用php中的数据,当我只需要拉入1行时就可以处理它。我查询每个,提取A的关联数组,过滤B数组,然后提取它。但是当开始拉动20-200行时,这个过程变得非常笨重。
表A有大约400,000行,看不到B超过10,000-20,000。
感谢您的帮助。
更新:这是我开始工作的代码。
SELECT a.UniqueId,
IF(b.Color, b.Color, a.Color) as Color,
IF(b.Price1 = 0, a.Price1, b.Price1) as Price1,
b.SPrice1
FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";
更新2:这么简单就更好了。 IF()解决了null和零。
如果(表达式1,表达式2,表达式3)
如果expr1为TRUE( expr1<> 0且expr1<> NULL ),则IF()返回expr2;否则返回expr3。 IF()返回数值或字符串值,具体取决于使用它的上下文。
SELECT a.UniqueId,
IF(b.Color, b.Color, a.Color) as Color,
IF(b.Price1, b.Price1, a.Price1) as Price1,
b.SPrice1
FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";
答案 0 :(得分:3)
我认为这可以涵盖所有场景:
SELECT
COALESCE(b.nullablefield, a.nullablefield) as nullablefield,
IF(b.intfield = 0, a.intfield, b.intfield) as intfield,
IF(b.floatfield = 0, a.floatfield, b.floatfield) as floatfield,
... etc ...
FROM table_a a
LEFT JOIN table_b b ON a.UniqueID = b.UniqueID