在相同的SELECT子句中使用列别名

Blo*_*ert 6 mysql

无论如何在同一个SELECT子句中使用列别名?例如:

SELECT ord_id, candy_id, price, quantity, 
price * quantity AS ext_cost, ext_cost * @tax_rate
Run Code Online (Sandbox Code Playgroud)

返回错误,因为MySQL ext_costext_cost * @tax_rate查询中无法识别" " .如果不可能,可以返回一个包含第一个查询中列出的所有内容的表,而不必写这样的内容吗?

SELECT ord_id, candy_id, price, quantity, 
price * quantity AS ext_cost, (price * quantity) * @tax_rate
Run Code Online (Sandbox Code Playgroud)

基本上,我只是想知道无论如何都要ext_cost在SELECT查询中重用.

WiR*_*R3D 19

在 MySQL 中,您可以在同一选择中引用选择列别名,只要它位于引用点之前即可。

SELECT 
    ord_id,
    candy_id,
    price,
    quantity, 
    price * quantity AS ext_cost,
    (SELECT ext_cost) * @tax_rate as retail_rate
Run Code Online (Sandbox Code Playgroud)

现在如果我知道如何在 postgres 中做到这一点就好了。


Hal*_*Ali 7

没有办法引用别名,但您可以将表达式赋值给变量,然后引用同一select子句中的变量.

在select语句中,变量赋值总是由中缀运算符完成:=.*在SET声明中,它可以是=:=.

例如

SELECT 
    ord_id
  , candy_id
  , price
  , quantity
  , @exc_cost := price * quantity AS exc_cost
  , @exc_cost * @tax_rate AS my_favourite_field
...
<FROM CLAUSE>
Run Code Online (Sandbox Code Playgroud)

您还可以有条件地执行变量赋值.

例如

IF(quantity > 90, 
     @exc_cost := price * quantity * 0.95
   , @exc_cost := price * quantity) AS exc_cost
Run Code Online (Sandbox Code Playgroud)

注1:如果没有聚合度量和group by子句,则根据列顺序评估变量:

SELECT @t, @t+2 FROM (SELECT @t := 1) a
Run Code Online (Sandbox Code Playgroud)

产生输出

@t   @t+2
 1      3
Run Code Online (Sandbox Code Playgroud)