[SQL] PostgreSQL의에서 소수점 후 비 제로 레코드를 가져 오기
SQLPostgreSQL의에서 소수점 후 비 제로 레코드를 가져 오기
나는 형 숫자의 양 필드가있는 테이블이있다. 그것은 서로 다른 양의 값을 포함합니다. 예를 들면
5.00
7.13
8.86
6.00
1.00
... 등
나는 소수점 후 제로가 아닌 경우에만 레코드를 가져했습니다. 즉, 금액에 해당하는 레코드 만 가져 오기
7.13
8.86
어떻게하니?
해결법
-
==============================
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.이것은 작동합니다 :
이것은 작동합니다 :
SELECT * FROM t WHERE round(amount,2) != round(amount)
그리고 더 직접 숫자를 떠 비교할 수 없습니다 - 코드 (증거로 SQLFiddle) NOT 작업을 수행 아래 :
SELECT * FROM t WHERE amount != round(amount)
비교가 실패합니다 - 그것은 일이지만, 그렇지 않은 같은 금액 = 1./3 * 3, 그것은 보인다면.
-
==============================
3.이 도움말 윌
이 도움말 윌
테이블 SELECT * FROM WHERE 양 - 바닥 (양)> 0.00
-
==============================
4.
SELECT * FROM t WHERE amount != round(amount);
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
'SQL' 카테고리의 다른 글
[SQL] SQL Server의 텍스트에서 추출 번호 (0) | 2020.06.16 |
---|---|
[SQL] 합니까 MS 액세스 (2003) 저장 프로 시저에 비해 아무것도. 나는 MS의 acceess에서 복잡한 쿼리를 실행하려면 (0) | 2020.06.16 |
[SQL] 최대 값을 기준으로 행을 삭제 (0) | 2020.06.16 |
[SQL] 자연 프로덕션 환경에 유해한 것으로 간주 (JOIN)인가? (0) | 2020.06.16 |
[SQL] 표 트리거 / 함수 (2.5 이하로 떨어지는 평균 등급을 정지)를 볼 수있다 돌연변이 (0) | 2020.06.16 |