我有型数字量字段的表。 它含有不同量的值。 例如
5.00
7.13
8.86
6.00
1.00
...等等。
我已经获取只有那些小数点后非零记录。 即,只获取相应的数额记录
7.13
8.86
我该怎么做?
我有型数字量字段的表。 它含有不同量的值。 例如
5.00
7.13
8.86
6.00
1.00
...等等。
我已经获取只有那些小数点后非零记录。 即,只获取相应的数额记录
7.13
8.86
我该怎么做?
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
这将工作:
SELECT *
FROM t
WHERE round(amount,2) != round(amount)
不,你不能直接比较浮点数 -下面的代码不起作用( SQLFiddle作为证明):
SELECT *
FROM t
WHERE amount != round(amount)
如果amount
= 1./3 * 3
,它看起来是1
,但它不是-比较会失败。
这能否帮助
SELECT * FROM table WHERE amount - floor(amount) > .00
SELECT *
FROM t
WHERE amount != round(amount);