loading
본문 바로가기
BACK-END/SQL, DB

PL/SQL - 내장함수

by pikiforyou 2020. 9. 24.

오라클에서 제공하는 함수는 무조건 값을 반환한다

 

문자열관련 내장함수

 

  • NVL(컬럼명,NULL인 경우 대체할 값) 
  • LOWER('문자열'): 대문자 ---> 소문자
    UPPER('문자열'): 소문자 ---> 대문자
    ex) SELECT UPPER('oracle') FROM DUAL; //ORACLE
  • INITCAP('문자열')
    - 첫 영문자를 대문자로 변환. 전부 대문자라면 첫문자를 제외하고 소문자로 자동변환된다.
    ex) SELECT INITCAP('oracle') FROM DUAL;   //Oracle
  • CONCAT('문자열','문자열')
    - 문자열 연결.  || 를 사용해도 된다 
    ex) SELECT CONCAT('ORACLE','JAVA') FROM DUAL +>ORACLEJAVA
  • LENGTH()
    - 문자열 길이
    ex) SELECT LENGTH('오라클') FROM DUAL;   //3
  • LENGTHB()
    - 문자열 길이를 바이트로
    ex) SELECT LENGTHB('오라클') FROM DUAL;   //6
  • LPAD('문자열', 문자열을 출력할 전체 자리수, '채울 문자열')
    - 좌측을 지정한 값으로 채운다
    ex) SELECT LPAD('HELLO',10,'X') FROM DUAL;  // XXXXXHELLO
         HELLO의 왼쪽을 채우는데 총10자리지정이니까 남는 5자리만큼 X를 입력하게 된다
    ex) SELECT LPAD('9',2,'0') FROM DUAL;  //09
  • RPAD('문자열', 전체 자리수, '채울 문자열')
    - 우측을 지정한 값으로 채운다
    ex) SELECT LPAD('HELLO',10,'X') FROM DUAL;    //HELLOXXXXX
    ex) SELECT LPAD('9',2,'0') FROM DUAL;   //90
    ex) SELECT RPAD('930224-',14,'*') FROM DUAL;     //930224-******* 주민번호처럼
  • INSTR('문자열','찾을 문자열')
    - 찾은 문자열의 인덱스 반환.  인덱스는 1부터 시작 / 찾은 문자열이 없다면 0 반환
    ex) SELECT INSTR('ABCDEFG','DE') FROM DUAL;   //4
    또한, LIKE연산자보다 INSTR(~~~,'#') !=0 이 더 성능이 좋다
       성능이 더 좋음 // SELECT * FROM DEPT WHERE instr(LOWER(DNAME),'e') !=0
       성능이 좀 떨어짐 // SELECT * FROM DEPT WHERE LOWER(DNAME) like '%e%' 
  • SUBSTR('문자열', 시작인덱스, 길이)
    - 문자열에서 시작인덱스부터 길이 만큼 가져옴. 인덱스는 1부터 시작
    ex) SELECT SUBSTR('123456789',3,3) FROM DUAL;   //345
  • REPLACE('문자열','바꿀 문자열','바뀔 문자열')
    - 특정 문자열을 다른 문자열로 대체
    ex) SELECT REPLACE('HELLO WORLD','HELLO','JAVA') FROM DUAL +>JAVA WORLD
  • TO_CHAR(숫자 혹은 날짜);
    - 숫자형식 포맷문자열 또는 날짜형식 포맷 문자열로 변환  아래에 자세히!
  • TO_NUMBER()
    - 문자형을 숫자형으로 변환
    ex) SELECT TO_NUMBER('123') + TO_NUMBER('456') FROM DUAL;   //579
    ex) SELECT '123' + '456' FROM DUAL;  //579
    사실 그냥 +를 써도 오라클이 알아서 숫자로 인식해준다. 
  • TRIM()
    - 양쪽 공백 제거 (중간은 제거되지않는다)
    ex) SELECT TRIM('    JA  VA    ') FROM DUAL;    //'JA  VA'

 

***TO_CHAR(숫자,'숫자포맷문자열')   :: 숫자를 문자로 다룰떼

9는 값이 있으면 표시, 없으면 공백

0은 값이 있으면 표시, 없으면 0으로 표시

단 소수점은 9든 0이든 의미없이 값이 없으면 모두 0으로 표시됨

단 소수점은 실제값의 자리수가 많으면 짤리고(반올림),

정수인데 실제값의 자리수가 많으면 #으로 표시 

ex)SELECT TO_CHAR(123,'0999') FROM DUAL;  // 0123 값이없는경우 0으로 채우는효과. 총4자리

ex)SELECT TO_CHAR(123,'9999') FROM DUAL; //   123 값이없는 경우 공백. 총4자리

ex)SELECT TO_CHAR(1234,'$999,999.99') FROM DUAL;  //$1,234.00

ex)SELECT TO_CHAR(1234,'L999,999.00') FROM DUAL;  //\1,234.00

ex)SELECT TO_CHAR(19.12345,'09.99') FROM DUAL;   //19.12

 

***TO_CHAR, 날짜 -> 문자 ::날짜형을 문자로 다룰때

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') FROM DUAL;

ex) SELECT TO_CHAR(HIREDATE,'YYYY/MM/DD DAY') HIREDATE FROM EMP;

ex) SELECT TO_CHAR(HIREDATE,'YYYY"년"MM"월"DD"일" DY') HIREDATE FROM EMP;

**한글로 'yyyy"년"mm"월"' 등 한글이 들어갈땐 ""로 감싸자. 총 ''로 감싸져있으니까

  • YY: 년도 2자리만
    YYYY: 년도 4자리
    MM : 01~12형태의 월 
    D : 요일 반환(일요일은 1,월요일 2)
    DD :1~31형태의 일 표시
    DDD : 해당 년도의 1월 1일부터 현재까지의 일수

    HH :1~12시 형태로 표시
      =HH12 :1~12시 형태로 표시
    HH24 :0~23시
    MI :0~59분
    SS :0~59초
  • AM/PM : 아무거나 써주면 오전/오후로 알아서 출력된다
  • DAY : 요일출력됨  ex)목요일
  • DY :  딱 요일만 출력됨  ex)목

***TO_DATE(' ') 날짜형식의문자를 -> DATE타입으로 

'2020-9-24'로 바로 집어넣으면 문자열이기때문에 인식을 하지못해서, DATE타입으로 해줘야한다

따라서 TO_CHAR(TO_DATE('원하는 날짜'), 원하는형식 'YYYY-DD'등) 이렇게 사용한다

단, 20/09/24, 20.09.24, 20-09-24, 20*09*24 다 날짜형식이 인정이 되는데

20년09월24일등 한글이 들어가면 날짜형식이 인정이 안된다.

 

 

 

 

 

날짜 관련 내장함수

  • SYSDATE : 현재 날짜 가져오기
  • +, -  : 날짜 더하기 빼기가 그대로 가능하다
  • TO_DATE : 위에 적혀져있음
  • MONTHS_BETWEEN (DATE타입,DATE타입) :개월 수 구하기
    ex)SELECT MONTHS_BETWEEN(SYSDATE,TO_DATE('2012/01/01')) FROM DUAL;  //2.48.....
  • ADD_MONTHS(DATE타입,숫자): 개월 수 더하기
    ex)SELECT ADD_MONTHS(SYSDATE,2) FROM DUAL;  //12-24
--예시1 만난날짜로부터 오늘이 몇일째인가?(정수형으로 떨구기위해 변환함)
SELECT TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'))-TO_DATE('2019-10-03') FROM DUAL;

 

 

 

 

숫자 관련 내장함수

  • ROUND() : 반올림 
    ex) SELECT ROUND(3.145) FROM DUAL;    //3
  • FLOOR(): 소수자리 버림
  • CEIL(): 올림
    ex) SELECT CEIL(3.1) FROM DUAL;   //4
  • MOD: 나머지
    ex) SELECT MOD(5,2) FROM DUAL;   //1
  • POWER(2,3):지수곱 
    ex) 2의 3승 = 8
  • SQRT(9):제곱근  //3
  • DECODE() 함수 : 첫번째 매개변수의 값에 따라 결과를 표시하는 함수

 

***DECODE() 함수 ?

DECODE(표현식, 값1,결과값1,값2,결과값2, ... 값N,결과값N,기본값)

  • 표현식이 값1일때 결과값1이 반환, 값2이면 결과값2 .... 아무것도 없으면 Dedault값이 반환
  • -witch문과 같다고 생각하면 된다 (값이 딱 떨어질때만 쓰는것)
  • 범위라면, CASE WHEN 을 사용한다
ACCEPT NUM PROMPT '숫자를 입력하세요';
DECLARE
    --NUM_ NUMBER := #
    STR NVARCHAR2(50);
    NOT_NUMBER EXCEPTION;
    PRAGMA EXCEPTION_INIT(NOT_NUMBER,-01722);
BEGIN
    SELECT DECODE(MOD('&NUM',3),0,'나머지가 0',1,'나머지가1','나머지가2') INTO STR FROM DUAL;
    DBMS_OUTPUT.PUT_LINE(STR);
    EXCEPTION
    WHEN NOT_NUMBER THEN
        DBMS_OUTPUT.PUT_LINE('숫자만 입력하세요');
END;
/

--또다른 예시
SELECT ENAME,JOB,DECODE(JOB,'CLERK','점원','SALESMAN','영업사원','기타')AS 직책 FROM EMP;

 

 

***CASE WHEN절

-범위로 사용할수도 있고, 물론 DECODE()처럼도 사용할수있다

-- CASE (만약 여기 무슨 식이 왔으면 DECODE식) WHEN 조건1 .....

CASE WHEN 조건1 THEN 결과값1
    WHEN 조건2 THEN 결과값2
    ELSE 그외값
 END AS 별칭  --기니까 별칭을 주자

 

예시 _CASE WHEN절 / 범위별 연봉등급구분하기
SELECT ENAME,SAL,
    CASE WHEN SAL>=3000 THEN '고액연봉자'
        WHEN SAL>=2000 THEN '중간연봉자'
        ELSE '소액연봉자'
    END 연봉레벨, JOB
FROM EMP
ORDER BY SAL;

 

 

연습문 ) 내장되어있는 테이블을 조건에 따라 정렬하기
SELECT LAST_NAME,RPAD(SUBSTR(EMAIL,1,1),LENGTH(EMAIL),'*')EMAIL,
    CASE WHEN SALARY >= 10000 THEN '고액연봉자'
        WHEN SALARY >= 5000 THEN '중간연봉자'
        ELSE '보통'
    END 등급,TO_CHAR(SALARY,'$999,999') SALARY,
        TO_CHAR(HIRE_DATE,'YYYY"년"MM"월"DD"일"')HIRE_DATE
FROM EMPLOYEES 
WHERE INSTR(LAST_NAME,'t') = LENGTH(LAST_NAME)
ORDER BY SALARY DESC;

 


 

'BACK-END > SQL, DB' 카테고리의 다른 글

데이터베이스의 흐름, DBMS의 종류와 형태에 관하여  (27) 2024.01.11
JDBC - ORACLE #2  (0) 2020.10.16
JOIN  (0) 2020.09.21
SQL, SELECT문, 쿼리순서 및 자료형  (0) 2020.09.18

댓글