这让我疯了。我希望以前没有问过,但我找不到答案,所以我会尽力解释这种情况。
我的目标是根据品牌,类别,价格等一系列标准获取产品及其颜色版本的数据。
基本查询工作正常,因为它会根据需要返回所有数据。
作为功能要求,客户可以根据产品价格过滤结果。
产品的基本价格可以用颜色价格覆盖。例如,产品成本为69.99,但蓝绿色成本为39.99
产品表有一个包含价格的字段pPrice - 覆盖来自if语句:
if (pc.iColourPrice != 0, pc.iColourPrice, p.pPrice) as pPrice
但是,如果客户端应用价格过滤器,例如50到70,则会在查询结尾处附加:
and pPrice between 50 and 70
不幸的是,这看起来像products.pPrice并通过iColourPrice忽略prodContainer表的覆盖。数据集的产品最终比请求的过滤器便宜。
问题是,如何应用将调整后的pPrice考虑在内的“where”过滤器?
答案 0 :(得分:2)
您可以像这样编写过滤器:
and if(pc.iColourPrice != 0, pc.iColourPrice, p.pPrice) between 50 and 70
(别名不能在WHERE子句中使用:Problems with Column Aliases)
答案 1 :(得分:0)
从if和in查询中重命名pPrice,写下新名称。
答案 2 :(得分:0)
使用HAVING而不是WHERE
SELECT if (pc.iColourPrice != 0, pc.iColourPrice, p.pPrice) as pPrice
FROM pc [+ JOINS]
WHERE [ + conditions]
HAVING pPrice BETWEEN 50 AND 70
在select之后和任何GROUP BY子句之后的某种意义上发生了,所以可以使用别名。