numeric
är exakt!
Till skillnad från ett annat svar, numeric
är inte en flyttalstyp , men en godtycklig precisionstyp som definieras av SQL-standarden. Lagringen är exakt . Jag citerar manualen:
Typnumeriken kan lagra tal med ett mycket stort antal siffror och utföra beräkningar exakt. Det rekommenderas särskilt för att lagra penningbelopp och andra kvantiteter där exakthet krävs.
Svar
Den naturliga kandidaten för din fråga är funktionen trunc()
. Den trunkeras mot noll - i princip att behålla heltalsdelen samtidigt som resten kasseras. Snabbast i ett snabbtest, men skillnaden är obetydlig bland topputmanarna.
SELECT * FROM t WHERE amount <> trunc(amount);
floor()
trunkeras till nästa lägre heltal, vilket gör skillnad med negativa tal:
SELECT * FROM t WHERE amount <> floor(amount);
Om dina siffror passar in i integer
/ bigint
du kan också bara casta:
SELECT * FROM t WHERE amount <> amount::bigint;
Detta rundar till fullständiga nummer, till skillnad från ovanstående.
Testa
Testad med PostgreSQL 9.1.7. Tillfällig tabell med 10k numeric
siffror med två bråksiffror, cirka 1 % har .00
.
CREATE TEMP TABLE t(amount) AS
SELECT round((random() * generate_series (1,10000))::numeric, 2);
Rätt resultat i mitt fall:9890 rader. Bästa tiden från 10 körningar med 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
Mestadels fortfarande sant i Postgres 12 (förutom att allt är> 10 gånger snabbare nu). Testa med 100k rader istället för 10k:
db<>spela här