PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Извличане на записи, които са различни от нула след десетичната запетая в PostgreSQL

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<>цигулка тук



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Задайте стойност в зависимост от диаграмата на Helm

  2. Автоматизирани надстройки на PostgreSQL клъстери в облак с почти нулев престой (част II)

  3. Получавате размер на голям обект в заявка на PostgreSQL?

  4. Най-добрите инструменти с отворен код за миграции на PostgreSQL

  5. Как да направите динамични изявления, подготвени за postgres в PHP