복붙노트

[SQL] PostgreSQL의에서 소수점 후 비 제로 레코드를 가져 오기

SQL

PostgreSQL의에서 소수점 후 비 제로 레코드를 가져 오기

나는 형 숫자의 양 필드가있는 테이블이있다. 그것은 서로 다른 양의 값을 포함합니다. 예를 들면

5.00
7.13
8.86
6.00
1.00

... 등

나는 소수점 후 제로가 아닌 경우에만 레코드를 가져했습니다. 즉, 금액에 해당하는 레코드 만 가져 오기

7.13
8.86

어떻게하니?

해결법

  1. ==============================

    1.다른 답변 주장과는 달리, 부동 소수점 형하지만, SQL 표준에 의해 정의 된 임의의 정밀도 유형 숫자가 아닙니다. 스토리지 정확한입니다. 나는 설명서를 인용 :

    다른 답변 주장과는 달리, 부동 소수점 형하지만, SQL 표준에 의해 정의 된 임의의 정밀도 유형 숫자가 아닙니다. 스토리지 정확한입니다. 나는 설명서를 인용 :

    귀하의 질문에 대한 자연 후보는 함수 TRUNC ()입니다. 그것은 0으로 자릅니다 - 나머지 부분을 폐기하면서 기본적으로 정수 부분을 유지. 빠른 테스트에서 가장 빠른,하지만 차이는 최고 경쟁자들 사이 실체이다.

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

    층 () 음수와 차이가 다음으로 낮은 정수로 자릅니다 :

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

    당신의 숫자가 정수에 맞는 경우 / 당신은 또한 단지 캐스트 할 수 있습니다 BIGINT :

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

    위는 달리 전체 숫자이 라운드.

    PostgreSQL을 9.1.7로 테스트. 두 개의 소수 자리 10K 숫자 숫자와 임시 테이블은 약 1 % .00 있습니다.

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

    9890 행 : 내 경우에는 올바른 결과. ANALYZE EXPLAIN 10 개 실행에서 가장 좋은 시간.

    어윈 (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
    

    Nandakumar V

    SELECT count(*) FROM t WHERE amount - floor(amount) > .00     -- 46.640 ms
    

    대부분 아직 진정한 포스트 그레스 12 (모든의를 제외> 10 배 빨라졌습니다). 100,000 행 대신 10K와 시험 : DB <> 바이올린 여기

  2. ==============================

    2.이것은 작동합니다 :

    이것은 작동합니다 :

    SELECT *
    FROM t
    WHERE round(amount,2) != round(amount)
    

    그리고 더 직접 숫자를 떠 비교할 수 없습니다 - 코드 (증거로 SQLFiddle) NOT 작업을 수행 아래 :

    SELECT *
    FROM t
    WHERE amount != round(amount)
    

    비교가 실패합니다 - 그것은 일이지만, 그렇지 않은 같은 금액 = 1./3 * 3, 그것은 보인다면.

  3. ==============================

    3.이 도움말 윌

    이 도움말 윌

    테이블 SELECT * FROM WHERE 양 - 바닥 (양)> 0.00

  4. ==============================

    4.

    SELECT *
    FROM t
    WHERE amount != round(amount);
    
  5. from https://stackoverflow.com/questions/15240652/fetch-records-that-are-non-zero-after-the-decimal-point-in-postgresql by cc-by-sa and MIT license