6 minute read

함수(Function)

  • 프로그램에서 반복 사용되는 부분을 분리하여 작성해 놓은 서브 프로그램
  • 호출하여 값을 전달하고 값을 리턴
  • 단일 행 함수
    • 각 행마다 반복 적용
    • 입력 받은 행의 개수만큼 결과 반환
  • 그룹 함수
    • 특정 행의 집합
    • 그룹 1개 당 1개의 결과 반환

LENGTH / LENGTHB

  • LENGTH
    • 문자열의 개수 반환
  • LENGTHB
    • 문자열의 BYTE 반환
    • 한글: 3BYTE
    • 영문, 숫자, 특수문자: 1BYTE
LENGTH(문자열)
LENGTHB(문자열)
SELECT EMP_NAME, LENGTH(EMP_NAME), EMAIL, LENGTH(EMAIL)
FROM EMPLOYEE;

Alt text


INSTR

  • 특정 문자의 위치 반환
  • POSITION : 찾을 위치 시작 값(기본 1)
    • 양수: STRING의 시작 > 끝
    • 음수: STRING의 끝 > 시작
  • POSITION, OCCURRENCE 생략 가능
INSTR ( [문자열], [찾을 문자 값], [찾기를 시작할 위치 POSITION], [찾은 결과의 순번 OCCURRENCE] )
SELECT INSTR('안녕하세요', '녕') AS "INSTR"
FROM DUAL;

Alt text

‘안녕하세요’ 문자열 중 ‘녕’의 글자 위치를 찾는다.
java와는 다르게 0부터 시작하지 않아서 2를 출력해준다.
POSITION과 OCCURRENCE은 생략 했다.

-

Alt text

‘요’ 자를 찾는데 OCCURRENCE는 생략하고 POSITION을 1로 입력했을 때
5를 반환한다.

POSITION에 양수를 입력했기 때문에 문자열의 시작 > 끝 방향으로 글자를 찾는다.

-

SELECT INSTR('안녕하세요 반가워요', '요', -1, 1) AS "INSTR"
FROM DUAL;

SELECT INSTR('안녕하세요 반가워요', '요', -1, 2) AS "INSTR"
FROM DUAL;

Alt text

이번에는 POSITION과 OCCURRENCE을 모두 사용했다.
끝 > 시작 방향으로 글자를 찾도록 POSITION에 음수를 입력했고
OCCURRENCE의 값만 다르게 해서 조회했다.

위는 첫 번째 ‘요’ 자를 찾고
아래는 두 번째 ‘요’ 자를 찾는다.


LPAD / RPAD

  • 문자 위치의 BYTE 크기 반환
  • 추가 문자(열) 생략 가능. 생략 시 공백 추가
  • LPAD : left
  • RPAD : right
LPAD( [문자열], [반환 할 문자열의 길이(BYTE)], [추가 문자열] )
RPAD( [문자열], [반환 할 문자열의 길이(BYTE)], [추가 문자열] )
SELECT LPAD(EMP_NAME, 10, '-')
FROM EMPLOYEE;

SELECT RPAD(EMP_NAME, 10, '-')
FROM EMPLOYEE;

Alt text

이번에는 최종 조회할 문자열의 길이(BYTE)까지 입력해주었다.
기존 이름 컬럼을 10BYTE까지 출력 하고
그 공간에 -(dash) 문자를 추가하도록 했다.
추가 문자(열)은 생략 가능하고, 생략 시 공백을 추가한다.
왼쪽, 오른쪽 구분해서 사용한다.


LTRIM / RTRIM

  • 왼쪽/오른쪽부터 지정한 문자를 잘라내고 남은 문자 리턴
  • 제거할 문자 생략 시 공백 제거
LTRIM( [문자열], [제거 할 문자열] )
SELECT LTRIM('   안녕하세요') FROM DUAL;

Alt text

’ 안녕하세요’ 에서 앞 공백 제거

-

SELECT LTRIM('눈누난나안녕하세요', '눈누난나') FROM DUAL;

Alt text

‘눈누난나안녕하세요’ 에서 ‘눈누난나’ 문자 제거

-

SELECT LTRIM('눈누난나눈누난나안녕하세요', '눈누난나') FROM DUAL;

Alt text

‘눈누난나눈누난나안녕하세요’ 에서 ‘눈누난나’ 문자를 제거하는데
연속 된 문자는 한 번만 작성해도 같이 제거가 된다. 연속성이 끊기기 전까지만 함께 제거 된다.

RPAD의 사용 방법은 동일하고
오른쪽 문자열을 제거한다는 것만 차이가 있다.


TRIM

  • 왼쪽/오른쪽/양쪽부터 지정한 문자를 잘라내고 남은 문자 리턴
  • LEADING : 왼쪽
  • TRAILING : 오른쪽
  • BOTH : 양쪽
TRIM( [LEADING OR TRAILING OR BOTH] [제거 할 문자열] FROM [문자열] )
SELECT TRIM('   안녕하세요   ') FROM DUAL;

Alt text

POSITION과 제거 할 문자열을 지정하지 않았을 때
양쪽 공백을 모두 삭제 후 출력 된다.

-

SELECT TRIM('꺆' FROM '꺆안녕하세요꺆') AS "TRIM" FROM DUAL;

Alt text

이번에는 제거 할 문자열을 ‘꺆’으로 입력했을 때의 모습니다. POSITION을 지정하지 않아, 위와 동일하게 양쪽에 있는 문자가 제거 되었다.

-

SELECT TRIM(LEADING '꺆' FROM '꺆안녕하세요꺆') AS "TRIM" FROM DUAL;

Alt text

POSITON을 LEADING으로 지정했을 때.
왼쪽의 ‘꺆’만 제거 되었다.

-

SELECT TRIM(TRAILING '꺆' FROM '꺆안녕하세요꺆') AS "TRIM" FROM DUAL;

Alt text

이번엔 오른쪽. TRAILING.

-

SELECT TRIM(BOTH '꺆' FROM '꺆안녕하세요꺆') AS "TRIM" FROM DUAL;

Alt text

POSITION을 BOTH로 지정해 준 모습인데,
아무것도 지정하지 않았을 때와 동일한 결과를 보여준다.
POSITION 생략 시, BOTH의 역할을 한다고 생각하면 될 거 같다.


SUBSTR

  • 지정한 위치부터 지정한 길이만큼 문자 잘라내어 리턴
  • POSITION
    • 생략 가능. 생략 시 왼쪽부터
    • 음수 지정 시 오른쪽 부터
SUBSTR(STRING, POSITION, LENGTH)
SELECT SUBSTR('123456789', 3) FROM DUAL;

Alt text

POSITION 지정해준 숫자의 자리수부터 반한한다.
그래서 3번째 자리인 3부터 출력된 모습이다.

-

SELECT SUBSTR('123456789', 3, 2) FROM DUAL;

Alt text

이번에는 POSITION, LENGHT를 모두 지정해주었다. 3번째 자리부터 2글자를 반환한다.

-

SELECT SUBSTR('123456789', -4, 2) FROM DUAL;

Alt text

POSITION에 음수를 지정했다. 음수로 지정할 경우 오른쪽부터 글자를 읽는다.
그래서 뒤에서 4번쨰 자리부터 2글자를 반환한다.


LOWER / UPPER / INITCAP

  • LOWER : 문자열을 모두 소문자로 변환
  • UPPER : 문자열을 모두 대문자로 변환
  • INITCAP : 문자열의 첫 글자만 대문자, 나머지는 소문자로 변환
LOWER(문자열)
UPPER(문자열)
INITCAP(문자열)
SELECT LOWER('Hello World!') FROM DUAL;

Alt text

-

SELECT UPPER('Hello World!') FROM DUAL;

Alt text

-

SELECT INITCAP('hello world!') FROM DUAL;

Alt text


CONCAT

  • 두 개의 문자열을하나의 문자열로 연결하여 리턴
  • 두 개만 가능
CONCAT([문자열], [문자열])
SELECT CONCAT(EMP_NAME, EMAIL) AS "이름/메일"
FROM EMPLOYEE;

Alt text

EMPLOYEE 테이블 내 이름과, 메일주소를 연결하여 조회했다.

-

SELECT CONCAT('안녕하세요', ' 반가워요') AS CONCAT
FROM DUAL;

Alt text

문자열을 직접 입력하여 연결한 모습이다. 이렇게도 가능.

-

SELECT '안녕하세요' || ' 반가워요' || ' 또 만나요' AS "연결 연산자"
FROM DUAL;

Alt text

CONCAT은 두 개의 문자열만 연결이 가능하기 때문에
여러 개의 문자열을 연결하고 싶을 경우, 연결 연산자를 사용해야한다.


REPLACE

  • 문자열 변환
REPLACE([문자열], [변경 될 문자열], [변경 할 문자열])
SELECT REPLACE('가나 다 라마바사', '다', '하') AS "REPLACE"
FROM DUAL;

Alt text

‘다’ > ‘하’ 변경 후 조회!


ABS

  • 숫자의 절대 값 반환
ABS(NUMBER)
SELECT ABS(10.9) FROM DUAL;  // 10.9
SELECT ABS(-10.9) FROM DUAL; // 10.9

MOD

  • 나머지 값 반환
MOD( [NUMBER], [DIVISION] )
SELECT MOD(10, 3) FROM DUAL;  // 1
SELECT MOD(-10, 3) FROM DUAL; // -1

ROUND

  • 지정한 위치부터 반올림한 값 반환
  • POSITION
    • 생략 시 : 소수점 아래 첫 번째 자리
    • 양수 : 소수점 기준 오른쪽
    • 음수 : 소수점 기준 왼쪽
ROUND(NUMBER)
ROUND( [NUMBER], [POSITION] )
SELECT ROUND(10.56789) FROM DUAL; // 11

Alt text

POSITION 생략 시 소수점 아래 첫 번째 자리에서 반올림.

-

SELECT ROUND(10.56789, 3) FROM DUAL; // 10.568

Alt text

양수 지정 시 소수점 기준 오른쪽에서 반올림을 한다. 3을 입력했기 때문에 소수점 아래에서 3번째 자리인 7에서 반올림이 되었다.

-

SELECT ROUND(16.56789, -1) FROM DUAL; // 20

Alt text

음수로 지정하면 소수점 왼쪽에서 반올림을 하기 때문에
16을 반올림하여 20이 되었다.


CEIL

  • 소수점 아래 올림한 값 반환
CEIL(NUMBER)
SELECT CEIL(10.11) FROM DUAL; // 11
SELECT CEIL(20.11) FROM DUAL; // 21

FLOOR

  • 소수점 아래 버림한 값 반환
FLOOR(NUMBER)
SELECT FLOOR(10.11) FROM DUAL; // 10
SELECT FLOOR(9.11) FROM DUAL;  // 9

TRUNC

  • 지정한 위치부터 소수점 자리의 수를 버리고 반환
  • POSITION 생략 시 소수점 아래 전부 버림
TRUNC([NUMBER], [POSITION])
SELECT TRUNC(10.12345) FROM DUAL;     // 10
SELECT TRUNC(10.12345, 1) FROM DUAL;  // 10.1
SELECT TRUNC(10.12345, 2) FROM DUAL;  // 10.1

SYSDATE

  • 시스템에 저장되어 있는 현재 날짜 반환
SELECT SYSDATE FROM DUAL;

Alt text

현재 날짜 출력!


EXTRACT

  • 년, 월, 일 정보 추출하여 반환
EXTRACT(YEAR FROM DATE)
EXTRACT(MONTH FROM DATE)
EXTRACT(DAY FROM DATE)
SELECT EXTRACT(YEAR FROM SYSDATE) AS "EXTRACT YEAR"
FROM DUAL;

Alt text

HIRE_DATE 컬럼에서 YEAR만 추출하여 조회한다.

-

SELECT EXTRACT(YEAR FROM DATE '2021-09-27') AS "EXTRACT YEAR"
FROM DUAL;

Alt text

이렇게 날짜를 직접 입력한 후에 추출할 수도 있다.

-

SELECT EXTRACT(MONTH FROM DATE '2021-09-27') AS "EXTRACT MONTH"
FROM DUAL;

Alt text

월 추출.

-

SELECT EXTRACT(DAY FROM DATE '2021-09-27') AS "EXTRACT DAY"
FROM DUAL;

Alt text

일 추출. .. Java에서 DAY는 요일이었잖아요….


MONTHS_BETWEEN

  • 두 날짜의 개월 수 차이를 데이터형으로 반환
MONTHS_BETWEEN( [DATE1], [DATE2] )
SELECT MONTHS_BETWEEN(SYSDATE, '21/07/01') AS "BETWEEN"
FROM EMPLOYEE;

Alt text

-

Alt text

SYSDATE : 21/09/27
위 이미지처럼 27일로 날짜를 맞추면 개월 수가 딱 맞게 떨어진다.
날짜를 다르게 설정했을 떄는 소수점 아래까지 엄청 나온다.

이럴 땐,
위에서 사용했던 소수점 아래를 다 버리거나 올려서 조회할 수 있다.

Alt text

소수점 아래를 다 버리는 것으로 선택하고
FLOOR를 사용하기 위해 괄호를 한 번 더 감싸줬다.
완전 깔끔.


ADD_MONTHS

  • 전달 받은 수 만큼의 개월 수를 더하여 반환
ADD_MONTHS( [DATE], [NUMBER] )
SELECT ADD_MONTHS(SYSDATE, 2)
FROM DUAL;

SYSDATE : 21/09/27
여기에 2개월을 더했을 때 결과는 21/11/27


NEXT_DAY

  • 기준 날짜로부터 가장 가까운 요일 반환(지나간 요일 제외)
  • 1 : 일요일 / 2 : 월요일 … 7 : 토요일
NEXT_DAY ( [DATE], [STRING OR NUMBER] )
SELECT NEXT_DAY(SYSDATE, '월요일') FROM DUAL;
SELECT NEXT_DAY(SYSDATE, '월') FROM DUAL;
SELECT NEXT_DAY(SYSDATE, 4)                 -- 수요일

SYSDATE : 21/09/27
오늘 기준으로 다가오는 월요일 중 제일 빠른 날짜를 반환한다. ‘요일’은 생략 가능하다.

숫자로 입력 시 1-7까지만 입력 가능하다.


LAST_DAY

  • 해당 월의 마지막 날 반환
LAST_DAY (DATE)
SELECT LAST_DAY(SYSDATE) FROM DUAL;
SELECT LAST_DAY('21/09/09') FROM DUAL;

SYSDATE가 9월이기 때문에 30을 반환한다.


Updated: