取这在PostgreSQL小数点后非零记录(Fetch records that are non z

2019-07-21 02:16发布

我有型数字量字段的表。 它含有不同量的值。 例如

5.00
7.13
8.86
6.00
1.00

...等等。

我已经获取只有那些小数点后非零记录。 即,只获取相应的数额记录

7.13
8.86

我该怎么做?

Answer 1:

numeric是准确的!

不同于权利由另一答案, numeric是不是一个浮点型 ,但一个任意精度的类型由SQL标准定义的。 存储是准确的 。 我引述手册:

该类型的数字可以存储数字与一个非常大的数量的数字,准确地进行计算。 特别推荐用于货币金额和需要精确其他量。

回答

为您的问题自然的候选是函数trunc() 它截断向零。 它也被证明是最快的快速测试。 但不同的是顶级的竞争者中单薄。

SELECT * FROM t WHERE amount <> trunc(amount);

这是一个缺口比简单的floor()因为它忽略了标志,应该是一个档次也更快。

SELECT * FROM t WHERE amount <> floor(amount);

如果数字融入integer / bigint你也可以只投:

SELECT * FROM t WHERE amount <> amount::bigint;

测试

经测试在PostgreSQL 9.1.7。 用10k临时表numeric与两位小数的数字,大约1%的人.00

CREATE TEMP TABLE t(amount) AS
SELECT round((random() * generate_series (1,10000))::numeric, 2);

正确的结果在我的情况:9890行。 从10次与最佳时间EXPLAIN ANALYZE

欧文1

SELECT count(*) FROM t WHERE amount <> trunc(amount)          -- 43.129 ms

MVP 2 / qqx

SELECT count(*) FROM t WHERE amount != round(amount)          -- 43.406 ms

欧文3

SELECT count(*) FROM t WHERE amount <> amount::int            -- 43.668 ms

MVP 1

SELECT count(*) FROM t WHERE round(amount,2) != round(amount) -- 44.144 ms

欧文4

SELECT count(*) FROM t WHERE amount <> amount::bigint         -- 44.149 ms

欧文2

SELECT count(*) FROM t WHERE amount <> floor(amount)          -- 44.918 ms

Nandakumar V

SELECT count(*) FROM t WHERE amount - floor(amount) > .00     -- 46.640 ms


Answer 2:

这将工作:

SELECT *
FROM t
WHERE round(amount,2) != round(amount)

不,你不能直接比较浮点数 -下面的代码不起作用( SQLFiddle作为证明):

SELECT *
FROM t
WHERE amount != round(amount)

如果amount = 1./3 * 3 ,它看起来是1 ,但它不是-比较会失败。



Answer 3:

这能否帮助

SELECT * FROM table WHERE amount - floor(amount) > .00



Answer 4:

SELECT *
FROM t
WHERE amount != round(amount);


文章来源: Fetch records that are non zero after the decimal point in PostgreSQL