如何在WHERE子句中使用计算列筛选数据?
如何在WHERE子句中使用计算列筛选数据?
嘿,这个问题我太熟了!咱们在SELECT里定义的计算列别名,为啥在WHERE里用不了?其实是SQL的执行顺序搞的鬼——数据库会先执行WHERE子句过滤数据,再去处理SELECT里的列计算和别名定义,所以WHERE阶段根本不知道你那个Percentage是啥,自然没法用。
给你几个实用的解决方案,结合你的例子来写,一看就懂:
方案1:直接把计算逻辑复制到WHERE子句里
这是最直接的办法,虽然有点重复代码,但不用改整体结构,适合逻辑不复杂的情况:
SELECT CONVERT(DECIMAL(10,2), (T_CUSTOMERPRICELISTBASESTANDARDRULE_PRICEDEFINITION.C_NETPRICE - T_PRODUCT_PURCHASING.C_LISTPRICEACTUAL) / T_CUSTOMERPRICELISTBASESTANDARDRULE_PRICEDEFINITION.C_NETPRICE ) * 100 AS Percentage FROM -- 这里补上你的表关联语句 WHERE CONVERT(DECIMAL(10,2), (T_CUSTOMERPRICELISTBASESTANDARDRULE_PRICEDEFINITION.C_NETPRICE - T_PRODUCT_PURCHASING.C_LISTPRICEACTUAL) / T_CUSTOMERPRICELISTBASESTANDARDRULE_PRICEDEFINITION.C_NETPRICE ) * 100 < 15;
方案2:用CTE(公共表表达式)封装计算逻辑
如果计算逻辑复杂,重复写容易出错,用CTE先把带计算列的结果集生成出来,再在外层筛选,代码可读性高很多:
WITH CalculatedMargins AS ( SELECT CONVERT(DECIMAL(10,2), (T_CUSTOMERPRICELISTBASESTANDARDRULE_PRICEDEFINITION.C_NETPRICE - T_PRODUCT_PURCHASING.C_LISTPRICEACTUAL) / T_CUSTOMERPRICELISTBASESTANDARDRULE_PRICEDEFINITION.C_NETPRICE ) * 100 AS Percentage, -- 把你需要的其他列也加在这里 T_CUSTOMERPRICELISTBASESTANDARDRULE_PRICEDEFINITION.C_NETPRICE, T_PRODUCT_PURCHASING.C_LISTPRICEACTUAL FROM -- 这里补上你的表关联语句 ) SELECT Percentage, C_NETPRICE, C_LISTPRICEACTUAL FROM CalculatedMargins WHERE Percentage < 15;
方案3:用子查询嵌套
和CTE思路类似,把计算逻辑放到子查询里,外层直接用别名筛选:
SELECT Percentage FROM ( SELECT CONVERT(DECIMAL(10,2), (T_CUSTOMERPRICELISTBASESTANDARDRULE_PRICEDEFINITION.C_NETPRICE - T_PRODUCT_PURCHASING.C_LISTPRICEACTUAL) / T_CUSTOMERPRICELISTBASESTANDARDRULE_PRICEDEFINITION.C_NETPRICE ) * 100 AS Percentage FROM -- 这里补上你的表关联语句 ) AS MarginSubQuery WHERE Percentage < 15;
额外小技巧:用HAVING子句(兼容性稍差)
有些数据库(比如MySQL)支持在HAVING里直接用别名,因为HAVING是在SELECT之后执行的,不过如果没有GROUP BY的话,部分数据库可能需要你把所有非聚合列都加到GROUP BY里,或者允许无分组的HAVING,示例:
SELECT CONVERT(DECIMAL(10,2), (T_CUSTOMERPRICELISTBASESTANDARDRULE_PRICEDEFINITION.C_NETPRICE - T_PRODUCT_PURCHASING.C_LISTPRICEACTUAL) / T_CUSTOMERPRICELISTBASESTANDARDRULE_PRICEDEFINITION.C_NETPRICE ) * 100 AS Percentage FROM -- 这里补上你的表关联语句 HAVING Percentage < 15;
不过这个方式不是所有数据库都支持,优先推荐前三个方案哦。
备注:内容来源于stack exchange,提问作者RISL2023
相关产品推荐
相关产品推荐

