sql >> Database teknologi >  >> RDS >> PostgreSQL

Hent poster, der ikke er nul efter decimaltegnet i PostgreSQL

numeric er præcis!

I modsætning til påstået af et andet svar, numeric er ikke en flydende kommatype , men en vilkårlig præcisionstype som defineret af SQL-standarden. Opbevaring er præcis . Jeg citerer manualen:

Typen numerisk kan gemme tal med et meget stort antal cifre og udføre beregninger nøjagtigt. Det anbefales især at opbevare pengebeløb og andre mængder, hvor nøjagtighed er påkrævet.

Svar

Den naturlige kandidat til dit spørgsmål er funktionen trunc() . Den afkortes mod nul - dybest set holder heltalsdelen, mens resten kasseres. Hurtigst i en hurtig test, men forskellen er ubetydelig blandt de bedste konkurrenter.

SELECT * FROM t WHERE amount <> trunc(amount);

floor() afkortes til det næste lavere heltal, hvilket gør en forskel med negative tal:

SELECT * FROM t WHERE amount <> floor(amount);

Hvis dine tal passer ind i integer / bigint du kan også bare caste:

SELECT * FROM t WHERE amount <> amount::bigint;

Dette runder til fulde tal, i modsætning til ovenstående.

Test

Testet med PostgreSQL 9.1.7. Midlertidig tabel med 10k numeric tal med to brøkcifre, omkring 1 % har .00 .

CREATE TEMP TABLE t(amount) AS
SELECT round((random() * generate_series (1,10000))::numeric, 2);

Korrekt resultat i mit tilfælde:9890 rækker. Bedste tid fra 10 løb 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

Det meste stadig sandt i Postgres 12 (bortset fra at alt er> 10x hurtigere nu). Test med 100k rækker i stedet for 10k:

db<>spil her



  1. POWER() Eksempler i SQL Server

  2. Sådan installeres Lighttpd med PHP, MariaDB og PhpMyAdmin i Ubuntu

  3. Sikkerhedsnet

  4. SQL Server-fejl 109:Der er flere kolonner i INSERT-sætningen end værdier angivet i VALUES-sætningen