본문 바로가기
IT/DB

[Oracle] 오라클 더 크고, 작은 값 비교와 주의할 점 GREATEST, LEAST(최대/최소값)

by 스터딩아재 2022. 1. 18.
반응형

 

 

GREATESTLEAST는 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

 

 

그리드형

댓글