sql >> Databasteknik >  >> RDS >> PostgreSQL

Hämta poster som inte är noll efter decimalkomma i PostgreSQL

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



  1. Postgres-trigger efter infogning åtkomst till NEW

  2. Ställ in ett standardvärde för en kolumn i SQLite:DEFAULT Constraint

  3. Hur man subtraherar 30 dagar från det aktuella datumet med SQL Server

  4. SQL välj max(datum) och motsvarande värde