别名CASE中的子查询

时间:2014-07-19 18:50:39

标签: php mysql sql

我有一个简单的INSERT查询,其中还包含其中一个列值的以下代码。

VALUES( ..... ,
CASE WHEN hand < (SELECT AVG(ss.hand) AS r FROM sales ss WHERE ss.year=:year)
     THEN (r - hand)
     ELSE 0
     END)";

这里的目标是在THEN内使用子查询结果平均值(别名为'r')。问题是,我收到一条错误,说运行查询时找不到列r。如果我从那个中移除'r',它运行正常。我不想将子查询复制到THEN,因为这会损害性能。

我也尝试对整个子查询进行别名,但这会导致语法错误。

有关此的任何提示吗?我是SQL的新手,现在已经花了好几个小时了。

1 个答案:

答案 0 :(得分:2)

你将不得不重复这个表达:

(CASE WHEN hand < (SELECT AVG(ss.hand) FROM sales ss WHERE ss.year=:year)
     THEN ((SELECT AVG(ss.hand) FROM sales ss WHERE ss.year=:year) - hand)
     ELSE 0
 END)

您也可以将其表达为:

greatest(0, (SELECT AVG(ss.hand) FROM sales ss WHERE ss.year=:year) - hand) )

另一种方法是使用select . . . insert并在from子句中定义此表达式。