为什么这些SQL查询之一有效,而其他却无效?

时间:2020-05-15 20:11:33

标签: sql postgresql

这是在PostgreSQL 12中完成的。我无法理解为什么以下查询有效(因为它返回两行):

SELECT facid, name, membercost, monthlymaintenance
FROM cd.facilities
WHERE membercost > 0 AND membercost < (monthlymaintenance * 1/50);

但是这个没有(它什么也不返回):

SELECT facid, name, membercost, monthlymaintenance
FROM cd.facilities
WHERE membercost > 0 AND membercost < (1/50) * monthlymaintenance;

但是,如果我在第二个查询中将1/50替换为0.02,它将起作用。为什么会这样呢?我在这里想念什么?我也无法在postgres数学运算文档中找到答案。如果确实存在,请指向我正确的部分。

此外,请随意编辑问题标题以使其更易于发现,因为考虑到问题的特殊性质,我想不出更通用的标题。

1 个答案:

答案 0 :(得分:2)

输入Postgres函数和运算符。 1/50使用整数除法,只会返回整数部分。

# select 1/50;
 ?column? 
----------
        0

要进行浮点除法,数字之一必须是浮点数

# select 1::float/50;
 ?column? 
----------
     0.02

或数字

# select 1::numeric/50;
        ?column?        
------------------------
 0.02000000000000000000

(1/50) * monthlymaintenance不起作用,因为它是0 * monthlymaintenance

monthlymaintenance * 1/50之所以有效,是因为monthlymaintenance可能是浮点型或数字型列。运算符优先级说...

  • float * integer / integer等同于
  • (float * integer) / integer成为
  • float / integer成为
  • float

1/50 * monthlymaintenance也不起作用,因为1/50首先解析为0 * monthlymaintenance