numeric
е точно!
За разлика от заявения от друг отговор, numeric
не е тип с плаваща запетаята , но стип с произволна прецизност както е дефинирано от стандарта SQL. Съхранението е точно . Цитирам ръководството:
Типът число може да съхранява числа с много голям брой цифри и да извършва точно изчисления. Особено се препоръчва за съхраняване на парични суми и други количества, където се изисква точност.
Отговор
Естественият кандидат за вашия въпрос е функцията trunc()
. Съкращава се към нула - основно запазване на цялата част, докато изхвърляте останалата. Най-бърз в бърз тест, но разликата е несъществена сред водещите претенденти.
SELECT * FROM t WHERE amount <> trunc(amount);
floor()
съкращава до следващото по-ниско цяло число, което прави разлика с отрицателни числа:
SELECT * FROM t WHERE amount <> floor(amount);
Ако вашите числа се вписват в integer
/ bigint
можете също така просто да предавате:
SELECT * FROM t WHERE amount <> amount::bigint;
Това закръгля до пълни числа, за разлика от горните.
Тест
Тестван с PostgreSQL 9.1.7. Временна таблица с 10k numeric
числа с две дробни цифри, около 1% имат .00
.
CREATE TEMP TABLE t(amount) AS
SELECT round((random() * generate_series (1,10000))::numeric, 2);
Правилен резултат в моя случай:9890 реда. Най-добро време от 10 проби с EXPLAIN ANALYZE
.
Ервин 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
Ервин 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
Ервин 4
SELECT count(*) FROM t WHERE amount <> amount::bigint -- 44.149 ms
Ервин 2
SELECT count(*) FROM t WHERE amount <> floor(amount) -- 44.918 ms
Нандакумар V
SELECT count(*) FROM t WHERE amount - floor(amount) > .00 -- 46.640 ms
Повечето все още вярно в Postgres 12 (освен всичко сега е> 10 пъти по-бързо). Тествайте със 100k реда вместо 10k:
db<>цигулка тук