这是在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数学运算文档中找到答案。如果确实存在,请指向我正确的部分。
此外,请随意编辑问题标题以使其更易于发现,因为考虑到问题的特殊性质,我想不出更通用的标题。
答案 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
。