Search

13. 비교함수

필드 또는 기준 항목의 비굣값을 구하거나, 목록에서 최솟값과 최댓값, 특정 값이 존재하는 구간 등을 구하는 함수를 실습한다.

13.1 DECODE()

‘기준값’이 ‘비굣값’과 같으면 ‘해당값’을 구하고, 그렇지 않으면 ‘미해당값’을 구한다.
DECODE(기준값, 비굣값, 해당값 [ , 미해당값]
DECODE(기준값, 비굣값1, 해당값1, 비굣값2, 해당값2, ..., 비굣값n, 해당값n [ , 미해당값]
예제1. 고객테이블에서 성별이 남성이면 ‘남’으로 바꾸고, 여성이면 ‘여’로 바꾼다. 모두 해당하지 않으면 ‘*’ 문자로 바꾼다.
SELECT CUSTOMER_CD, CUSTOMER_NM, MW_FLG, DECODE(MW_FLG,'M','남','W','여','*')AS 성별, TOTAL_POINT FROM TB_CUSTOMER;
SQL
복사
예제2. 기타정보 테이블에서 관심품목 목록 값을 다음과 같이 바꾼다.
‘S01’을 포함하면 ‘의류/잡화’
‘S02’를 포함하면 ‘뷰티’
...등등등
INSTR 과 DECODE를 함께 사용해서 나타낸다.
SELECT CUSTOMER_CD, CUSTOMER_ENG_NM, ITEM_LIST, SUBSTR(DECODE(INSTR(ITEM_LIST,'S01'),0,'',',의류/잡화')|| DECODE(INSTR(ITEM_LIST,'S02'),0,'',',뷰티')|| DECODE(INSTR(ITEM_LIST,'S03'),0,'',',레저/자동차')|| DECODE(INSTR(ITEM_LIST,'S04'),0,'',',식품')|| DECODE(INSTR(ITEM_LIST,'S05'),0,'',',생활/건강')|| DECODE(INSTR(ITEM_LIST,'S06'),0,'',',가구/인테리어')|| DECODE(INSTR(ITEM_LIST,'S07'),0,'',',가전')|| DECODE(INSTR(ITEM_LIST,'S08'),0,'',',도서/취미')|| DEOCDE(INSTR(ITEM_LIST,'S09'),0,'',',컴퓨터')|| DECODE(INSTR(ITEM_LIST,'S10'),0,'',',브랜드'),2) -- SUBSTR로 ','를 제외하고 가져옴 AS 관심품목명 FROM TB_ETC_INFO;
SQL
복사
DECODE의 ‘0’은 즉 포함이 포함이 되어있는지 아닌지를 결정하는 기준값이 되는 것이다.
INSTR()또는 INSTRB()함수는 지정한 문자열에서 찾는 문자가 있으면 0이상의 위치값을 반환하고 없으면 0을 반환하는 것을 유의하자.

13.2 NVL()

NVL()함수는 ‘기준값’이 NULL값이면 ‘특정값’을 구하고, 아니면 ‘기준값’을 구한다. 예를 들어, “NVL(ADD_POINT, 50)” 의 결과는 ADD_POINT 필드의 값에 따라 다르다. ADD_POINT값이 있으면 ADD_POINT 값을 반환하고, 값이 없으면(즉, NULL이면) 50을 반환한다.
NVL(기준값, 특정값)
예제1. 고객테이블에서 전화번호에 값이 없으면 ‘XXX-XXXX-XXXX’을 보이고, 그렇지 않으면 기존 전화번호로 검색한다.
/* NVL */ SELECT CUSTOMER_CD, CUSTOMER_NM, MW_FLG, BIRTH_DAY, NVL(PHONE_NUMBER,'XXX-XXXX-XXXX')AS PHONE_NUMBER, EMAIL FROM TB_CUSTOMER;
SQL
복사

13.3 LEAST()

LEAST()함수는 입력한 ‘값1’, ’값2’, ‘값3’, ... 중에서 최솟값을 구한다. 값의 형식은 수치, 문자열, 날짜 등이다. 예를 들어, “LEAST(89,92,57)” 의 결과는 57이고, “LEAST(’F’,’B’,’C’)” 의 결과는 ‘B’다.
예제1. 12, -10, -3, 335, 200, 45 수치 중 최솟값을 구한다.
SELECT LEAST(12,-10,-3,335,200,45) AS LEAST_NUM FROM DUAL;
SQL
복사
예제2. 현재 일시, 현재 일시+3일, 현재 일시-2 날자 중 최솟값을 구한다.
SELECT LEAST(SYSDATE, SYSDATE+3, SYSDATE-2) AS LEAST_DT FROM DUAL;
SQL
복사

13.4 GREATEST()

GREATEST()함수는 입력한 값중에서 최댓값을 구한다. 마찬가지로 값의 형식은 수치, 문자열, 날짜등이다.
예제1. 12, -10, -3, 335, 200, 45 중에서 최댓값을 구한다.
SELECT GREATEST(12,-10,-3,335,200,45) AS GREAT_NUM FROM DUAL;
SQL
복사
예제2. 현재 일시, 현재 일시+3일, 현재 일시-1일 날짜 중 최댓값을 구한다.
SELECT GREATEST(SYSDATE, SYSDATE+3, SYSDATE-1) AS GREAT_DATE FROM DUAL;
SQL
복사

13.5 WIDTH_BUCKET()

WIDTH_BUCKET() 함수는 ‘시작값’에서 ‘종료값’까지를 ‘분할값’만큼 구간을 만들고 ‘기준값’이 어느 구간에 있는지 구한다. 예를들어, “WIDTH_BUCKET(15,1,50,10)” 의 결과는 1에서 50까지의 숫자 범위를 10개의 구간으로 나누고 15가 포함된 구간인 3을 반환한다.
WIDTH_BUCKET(기준값, 시작값, 종료값, 분할값)
예제1. 1에서 50까지의 숫자 범위를 10개 구간으로 나누고 38이 위치한 구간을 구한다.
SELECT WIDTH_BUCKET(38,1,50,10) FROM DUAL;
SQL
복사
결과는 8이다.