在Where子句中使用命名列

时间:2019-04-27 15:34:44

标签: sql oracle

我遇到一个问题,说“总计”是我的where子句上的无效标识符。我想使用“总计”并将其与在在此处插入代码部分中确定的另一个数字进行比较,但无法弄清楚如何正确设置where的第一部分。

像我一样命名列时,要在何处使用该列时不使用名称吗?

 SELECT desc, TO_CHAR(SUM(price * quantity), '99999.00') AS "total amount"
 FROM items i
 JOIN line_items li
   ON i.item_id = li.item_id
 WHERE "total amount" > 
   (*insert code here*);

2 个答案:

答案 0 :(得分:1)

首先,您需要一个having子句,而不是一个where原因。

第二,您的查询缺少group by

第三,您不能在Oracle的wherehaving中使用列别名。相反,您需要重复该表达式,使用子查询或使用CTE。

对于此示例,我建议:

SELECT i.desc,
       TO_CHAR(SUM(i.price * li.quantity), '99999.00') AS "total amount"
FROM items i JOIN
     line_items li
     ON i.item_id = li.item_id
GROUP BY i.desc
HAVING SUM(i.price * li.quantity) > ?;

注意:

  • ?用于比较值或表达式。
  • 您的查询缺少GROUP BY
  • desc是列的 really 坏名,因为它是一个SQL关键字(请考虑ORDER BY)。
  • 养成对查询中所有列引用进行限定的好习惯,以识别它们来自的表。我对此查询做出了有根据的猜测。
  • 无论如何,您都不希望在"total amount"上进行比较,因为它是一个字符串,并且(毫无疑问)您希望对数字进行比较(所以10 > 9'10' < '9'

答案 1 :(得分:0)

派生值应始终放在方括号中。

SELECT * FROM 
(
    SELECT desc, TO_CHAR(SUM(price * quantity), '99999.00') AS "total amount"
    FROM items i
    JOIN line_items li ON i.item_id = li.item_id
) AMT
WHERE "total amount" > '' /* YOUR VALUE HERE */