반응형
GREATEST와 LEAST는 SELECT 절에 쓰이는 MIN, MAX() 그룹함수와 유사하지만 각기 다른 값들의 크기를 비교하는데 주로 쓰입니다. 가장 빠른 날짜를 구하거나 가장 큰 숫자를 구할 때 자주 쓰입니다. 사용방법에 대해서 알아보겠습니다.
GREATEST, LEAST 함수 사용법
두 함수는 기본적으로 사용법이 동일하고 매우 간단히 나열만 하면 됩니다.
최대값 반환 = GREATEST( 변수1, 변수2, 변수3, ... )
최소값 반환 = LEAST( 변수1, 변수2, 변수3, ... )
SELECT GREATEST( 1, 2, 3, 4, 5 )
, LEAST( SYSDATE, TO_DATE('2021-12-08', 'YYYYMMDD') )
DAUL
주의사항(DATA Type, NULL, listagg)
1. 함수 내의 인자값의 데이터 형식은 동일해야 합니다.
다를 경우 ORA ERROR 발생합니다. 각 데이터 형에 따라 ora-00932, ora-01722, ora-01858
SELECT LEAST ( 1, SYSDATE )
FROM DUAL
-- ORA-00932: inconsistent datatypes: expected NUMBER got DATE
SELECT LEAST ( 1, 'A' )
FROM DUAL
-- ORA-01722: invalid number
SELECT LEAST ( sysdate , 'A' )
FROM DUAL
-- ORA-01858: a non-numeric character was found where a numberic was expected
다만, 인자값 중 맨 앞의 값이 문자열이면 ERROR가 안 나옵니다.
첫 인자값의 데이터 형으로 다음 값을 비교하면서 모두 문자열로 취급하게 되기 때문인 것 같습니다.
SELECT LEAST ( 'A', SYSDATE )
FROM DUAL
-- 18-JAN-22
SELECT LEAST ( 'A', 1 )
FROM DUAL
-- 1
2. 인자값에 NULL이 있으면 NULL만 리턴됩니다
이같은 상황을 방지하기 위해 값에 NVL 처리를 하는 것이 좋습니다.
SELECT LEAST( 1, 2, 3, NULL )
FROM DUAL
-- NULL
SELECT LEAST( 1, 2, 3, NVL(NULL,0) )
FROM DUAL
-- 0
3. 인자값은 독립적인 값들이여야 하며, LISTAGG 등으로 붙인 문자열은 안 됩니다.
아래와 같이는 사용 불가.
SELECT LEAST ( LISTAGG(DATA) )
FROM DATA_TBL
한번 더 감싸면 가능합니다.
SELECT LEAST( TBL2.DATA )
FROM (
SELECT LISTAGG(DATA) AS DATA
FROM DATA_TBL
) TBL2
그리드형
'IT > DB' 카테고리의 다른 글
[Mybatis] java.lang.RuntimeException: parameter[MI] no set 해결방법 (0) | 2022.04.08 |
---|---|
[ORACLE] 타임스탬프로 과거데이터 조회 복구하기 (TIMESTAMP) (0) | 2022.02.18 |
[Oracle] 오라클 시퀀스(Sequence) 생성/수정/삭제/currval/nextval (0) | 2021.12.30 |
[ORACLE] ORA-01732 : 뷰에 대한 조작이 부적합합니다. (0) | 2021.12.22 |
[ORACLE] 널(NULL)에 대한 IN과 NOT IN (0) | 2021.11.27 |
댓글