sql >> Databáze >  >> RDS >> PostgreSQL

Načte záznamy, které jsou nenulové za desetinnou čárkou v PostgreSQL

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



  1. PostgreSQL funkce pro poslední vložené ID

  2. Naučte se používat několik funkcí MySQL a MariaDB – část 2

  3. Aktualizujte příkaz if pro Oracle

  4. Ukládání hodnot hash SHA1 v MySQL