numeric
je přesné!
Na rozdíl od tvrzení jiné odpovědi, numeric
není typu s plovoucí desetinnou čárkou , ale libovolný typ přesnosti jak je definováno standardem SQL. Úložiště je přesné . Cituji manuál:
Typ numeric může ukládat čísla s velmi velkým počtem číslic a provádět výpočty přesně. Zvláště se doporučuje pro ukládání peněžních částek a jiných množství, kde je vyžadována přesnost.
Odpověď
Přirozeným kandidátem na vaši otázku je funkce trunc()
. Zkrátí se směrem k nule - v podstatě ponechání celé části a vyřazení zbytku. Nejrychlejší v rychlém testu, ale rozdíl mezi nejlepšími uchazeči je nepodstatný.
SELECT * FROM t WHERE amount <> trunc(amount);
floor()
zkrátí na nejbližší nižší celé číslo, což znamená rozdíl se zápornými čísly:
SELECT * FROM t WHERE amount <> floor(amount);
Pokud se vaše čísla vejdou do integer
/ bigint
můžete také jen odeslat:
SELECT * FROM t WHERE amount <> amount::bigint;
Toto zaokrouhluje na plný počet, na rozdíl od výše uvedeného.
Test
Testováno s PostgreSQL 9.1.7. Dočasná tabulka s 10k numeric
čísla se dvěma desetinnými číslicemi, přibližně 1 % má .00
.
CREATE TEMP TABLE t(amount) AS
SELECT round((random() * generate_series (1,10000))::numeric, 2);
Správný výsledek v mém případě:9890 řádků. Nejlepší čas z 10 běhů s EXPLAIN ANALYZE
.
Erwin 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
Erwin 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
Erwin 4
SELECT count(*) FROM t WHERE amount <> amount::bigint -- 44.149 ms
Erwin 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
Většinou stále platí v Postgres 12 (kromě všeho je nyní> 10x rychlejší). Test se 100 000 řádky namísto 10 000:
db<>zde hrajte