반응형

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm#sthref912


1. ADD_MONTHS
2. CURRENT_DATE
3. CURRENT_TIMESTAMP
4. DBTIMEZONE
5. EXTRACT (datetime)
6. FROM_TZ
7. LAST_DAY
8. LOCALTIMESTAMP
9. MONTHS_BETWEEN
10. NEW_TIME
11. NEXT_DAY
12. ROUND (date)
13. SESSIONTIMEZONE
14. SYSDATE
15. SYSTIMESTAMP
16. TO_CHAR (date)
17. TO_TIMESTAMP
18. TRUNC (date)
19. TZ_OFFSET

반응형
반응형

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm#sthref912

 

SQL Functions(10g) - Character Functions

 

1. CHR(N) - 바이너리 값 N을 VARCHAR2 값으로 변환한 값을 반환한다.

 

SQL> SELECT CHR(72)||CHR(69)||CHR(76)||CHR(76)||CHR(79) AS "HELLO" FROM DUAL;

 

 

 

A(65), B(66), C(67), D(68), E(69), F(70), G(71), H(72), I(73)
J(74), K(75), L(76), M(77), N(78), O(79), P(80), Q(81), R(82)
S(83), T(84), U(85), V(86), W(87), X(88), Y(89), Z(90)

 


2. CONCAT(S1, S2) - 문자열 S1과 문자열 S2를 연결하여 합친다.

 

SQL> SELECT CONCAT('Hello',' World') AS "Hello World" FROM DUAL;

 

SQL> SELECT CONCAT(CONCAT(LAST_NAME, '''s salary is '), SALARY ) AS "Salary"  FROM EMPLOYEES;
 

 

 

3. INITCAP(S) - 문자열 S에서 각 단어에서 시작하는 첫 문자를 대문자로 시작한다.

 

SQL> SELECT INITCAP('hello world') AS "Hello World", INITCAP('HELLO WORLD') AS "HELLO WORLD", INITCAP('hElLO wOrLd') AS "hElLO wOrLd" FROM DUAL;

 

 

 

 

4.  LOWER(S) - 문자열 S의 알파벳을 모두 소문자로 변환하여 반환한다.

 

SQL> SELECT LOWER('HELLO WORLD') AS "HELLO WORLD" FROM DUAL;

SQL> SELECT LAST_NAME AS "LAST_NAME", LOWER(LAST_NAME) AS "LOWERCASE" FROM EMPLOYEES WHERE ROWNUM < 3;

 

 

 


5. UPPER - 문자열 S의 알파벳을 모두 대문자로 변환하여 반환한다.


SQL> SELECT UPPER('hello world') AS "hello world" FROM DUAL;

SQL> SELECT LAST_NAME AS "LAST_NAME", UPPER(LAST_NAME) AS "UPPER" FROM EMPLOYEES WHERE ROWNUM < 3;

 

 

 


6. LPAD(S, N, P) - 문자열 S의 길이가 N보다 작으면 왼쪽에 P문자를 N-LENGTH(S) 만큼 추가한다.

SQL> SELECT LPAD('Star',7,'*') AS "Star 7", LPAD('Star',4,'*') AS "Star 4", LPAD('Star',3,'*') AS "Star 3" FROM DUAL;

 


7. RPAD(S, N, P) - 문자열 S의 길이가 N보다 작으면 오른쪽에 P문자를 N-LENGTH(S) 만큼 추가한다.

SQL> SELECT RPAD('Star',7,'*') AS "Star 7", RPAD('Star',4,'*') AS "Star 4", RPAD('Star',3,'*') AS "Star 3" FROM DUAL;

 

SQL> SELECT LAST_NAME, RPAD(' ', SALARY/1000/1, '*') "SALARY" FROM EMPLOYEES
ORDER BY LAST_NAME;

 

 


8. RELPACE(S, S1, S2) - 문자열 S에서 문자 혹은 문자열 S1을 찾아 S2로 바꾼 결과를 반환한다.

 

SQL> SELECT REPLACE('There is no blank!.', ' ', '*') "Changes" FROM DUAL;


SQL> SELECT REPLACE('JACK and JUE','J','BL') "Changes" FROM DUAL;

 

 

 


9. TRIM - LEADING(왼쪽 제거), TRAILING(오른쪽 제거), BOTH(왼쪽, 오른쪽 제거) 사용 가능

              제거 해야 할 문자가 없으면, blank space 제거, 그리고 BOTH(양쪽)에서 blank space 제거

 

SQL> SELECT TRIM(LEADING '*' FROM '***Hello***World***') AS "LEADING" FROM DUAL;

 

SQL> SELECT TRIM(TRAILING '*' FROM '***Hello***World***') AS "TRAILING" FROM DUAL;

 

SQL> SELECT TRIM(BOTH '*' FROM '***Hello***World***') AS "BOTH" FROM DUAL;

 

 

SQL> SELECT TRIM('   Hello   World   ') AS "BOTH" FROM DUAL;

 

 

 


10. LTRIM(S, S1) - 문자열 S에서 문자 혹은 문자열 S1을 왼쪽에서 모두 지운 값을 반환한다.

                          제거 해야 할 문자가 없으면, 왼쪽만 blank space 제거

 

SQL> SELECT '***Hello***World***' AS "Hello World", LTRIM('***Hello***World***', '*') AS "LTRIM" FROM DUAL;

 

 

 

SQL> SELECT '   Hello   World   ' AS "Hello World", LTRIM('   Hello   World   ') AS "LTRIM" FROM DUAL;

 

 

 

 

11. RTRIM(S, S1) - 문자열 S에서 문자 혹은 문자열 S1을 오른쪽에서 모두 지운 값을 반환한다.

                          제거 해야 할 문자가 없으면, 오른쪽만 blank space 제거

 

SQL> SELECT '***Hello***World***' AS "Hello World", RTRIM('***Hello***World***', '*') AS "RTRIM" FROM DUAL;

 

SQL> SELECT '   Hello   World   ' AS "Hello World", RTRIM('   Hello   World   ') AS "RTRIM" FROM DUAL;

 

SQL> SELECT RTRIM('BROWNING: ./=./=./=./=./=.=','/=.') "RTRIM example" FROM DUAL;

 

 

 


12. SUBSTR(S, M, N) - 문자열 S를 M번째 CHAR부터 N의 길이로 잘라낸다.

 

SQL> SELECT SUBSTR('Hello World', 1, 5) AS "Hello", SUBSTR('Hello World', 7, 5) AS "World", SUBSTR('Hello World', -5, 5) AS "Hello"  FROM DUAL;

 

SQL>SELECT SUBSTR('Hello World', 0, 1) FROM DUAL;
SQL>SELECT SUBSTR('Hello World', 0, 2) FROM DUAL;
SQL>SELECT SUBSTR('Hello World', 1, 2) FROM DUAL;

 

 

SQL>SELECT SUBSTR('Hello World', 0) FROM DUAL;
SQL>SELECT SUBSTR('Hello World', 1) FROM DUAL;
SQL>SELECT SUBSTR('Hello World', 5) FROM DUAL;

 

 

 


13. INSTR(S,S1, M, N) - 문자열 S에서 문자 혹은 문자열 S1의 시작 위치를 반환한다.
                                 단, 시작 위치는 M이고 N번째 S1의 시작 위치를 반환한다.


SQL> SELECT INSTR('HELLO WORLD','O', 1, 1) "Instring1", INSTR('HELLO WORLD','O', 1, 2) "Instring2", INSTR('HELLO WORLD','O', 1, 3) "Instring3" FROM DUAL;

 


SQL>SELECT INSTR('HELLO WORLD','O', -1, 1) "Instring" FROM DUAL;

SQL>SELECT INSTR('HELLO WORLD','O', -7, 1) "Instring" FROM DUAL;

 

 

 


14. TRANSLATE(S, S1, R) - 문자열 S에서 문자 S1을 찾아 R로 바꾼 값을 반환한다.

SQL> SELECT TRANSLATE('0123456789', '0123456789', 'helloworld') FROM DUAL;
SQL> SELECT REPLACE('0123456789', '1', 'x') FROM DUAL;

 

 

SQL> SELECT TRANSLATE('A0B1CDEF2G3H9', '+.0123456789', ' ') FROM DUAL;
SQL> SELECT TRANSLATE('A0B1CDEF2G3H9', '1234567890', ' ') FROM DUAL;

 

 

SQL> SELECT NVL(LENGTH(TRANSLATE('A0B1CDEF2G3H9', '+.0123456789', ' ')), 0) FROM DUAL;
SQL> SELECT NVL(LENGTH(TRANSLATE('123456789', '+.0123456789', ' ')), 0) FROM DUAL;

 

 

SQL> SELECT TRANSLATE('123전화번호', '0123456789'||'전화번호', 'ABCDEFGHIJKLMN') FROM DUAL;

 

 

 

 

15. LENGTH(S) - 문자열 S의 길이를 반환한다.

 

SQL> SELECT LENGTH('HelloWorld') FROM DUAL;

 

SQL>SELECT LENGTH(HelloWorld) FROM DUAL;

SQL>SELECT LENGTH('01234') FROM DUAL;
SQL>SELECT LENGTH(01234) FROM DUAL;

 

 

 


 

16. REGEXP_REPLACE

 

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm#i1305521

 

SQL> SELECT
  REGEXP_REPLACE(PHONE_NUMBER,
                 '([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})',
                 '(\1) \2-\3') "REGEXP_REPLACE"
  FROM EMPLOYEES;

 

SQL> SELECT PHONE_NUMBER FROM EMPLOYEES;

 



SQL> SELECT
  REGEXP_REPLACE(COUNTRY_NAME, '(.)', '\1 ') "REGEXP_REPLACE"
  FROM COUNTIRES;

 

 


17. REGEXP_SUBSTR

 

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions131.htm#i1239858

 


18. SOUNDEX(S) - 문자열 S와 소리가 비슷한 것들 나타낸다.

 

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions148.htm#i78853

 

SQL> SELECT LAST_NAME, FIRST_NAME
         FROM HR.EMPLOYEES
         WHERE SOUNDEX(LAST_NAME) = SOUNDEX('SMYTHE');

 

 

 

반응형
반응형

1. 9i 함수 메뉴얼

* http://docs.oracle.com/cd/B10501_01/server.920/a96540/functions2a.htm#80856

 

2. 10g 함수 메뉴얼
* http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm#sthref912

# 가공 --> 연산 - 산술
                - 연결
                - 논리
                - ...
       --> 함수 - 단일행 함수 : lower ... : 3장
                - 복수행 함수 : avg   ... : 4장
                - 사용자 정의 함수        : PL/SQL

 

# 3-3 : argument? 아규먼트, 인자, 인수, 매개변수, 파라미터, ...

  col ip format a20
  select  user, sysdate, userenv('sid'), SYS_CONTEXT ('USERENV', 'IP_ADDRESS') as ip          from dual;
  select ename, lower(ename), instr(ename, 'E'), lower(substr(ename, 1, 2)), substr(ename, 3) from emp;

----------------------
 Character
----------------------

# 3-11

 - substr

   select ename, substr(ename, 2, 3), substr(ename, 2), substr(ename, -2, 1) from emp;

   select ename, lpad(ename, 10), ename                               from emp;
   select ename, substr(lpad(ename, 10), 10, 1), substr(ename, -1, 1) from emp;

 - length

   select ename, length(ename) from emp;

   select * from emp where length(ename) = 5;         --> 이름이 5자인 사원
   select * from emp where ename like '_____';        --> 이름이 5자인 사원

 - instr

   select ename, instr(ename, 'A') from emp;

   select * from emp where instr(ename, 'A') > 0;     --> 이름에 A가 포함된 사원
   select * from emp where ename like '%A%';          --> 이름에 A가 포함된 사원

 - rpad, lpad

   col stars format a60

   select empno, ename, sal, sal from emp;
   select empno, ename, sal, round(sal/100) from emp;
   select empno, ename, sal, '*', round(sal/100) from emp;
   select empno, ename, sal, rpad('*', round(sal/100)) as stars from emp;
   select empno, ename, sal, rpad('*', round(sal/100), '*') as stars from emp;

   col ename2 justify r
   col ename2 format a10
   select empno, ename, lpad(ename, 10) as ename2, sal from emp;

 - ltrim, rtrim vs trim

   select ltrim('SOS', 'S')            from dual;
   select trim(leading 'S' from 'SOS') from dual;

   select rtrim('SOS', 'S')             from dual;
   select trim(trailing 'S' from 'SOS') from dual;

   select rtrim(ltrim('SOS', 'S'), 'S') from dual;
   select trim(both 'S' from 'SOS')     from dual;

         --------

   select ltrim('ABBACAB', 'AB')            from dual;    --> http://docs.oracle.com/cd/B10501_01/server.920/a96540/functions68a.htm#77877
   select trim(leading 'AB' from 'ABBACAB') from dual;    --> ORA-30001: trim set should have only one character

 - reverse

   select ename, reverse(ename) from emp;

문제. 숫자로만 이루어진 행을 찾으세요.

  drop table t1 purge;
  create table t1 (col1 varchar2(30));
  insert into t1 values ('23FA2');
  insert into t1 values ('564766');
  insert into t1 values ('40953');
  insert into t1 values ('P3312');
  insert into t1 values ('48756');
  insert into t1 values ('8876M');
  insert into t1 values ('...');

  commit;

  grant select on t1 to public;

  select * from t1;

  해답 1.

    select upper(col1), lower(col1) from t1;
    select upper(col1), lower(col1) from t1 where upper(col1) = lower(col1);

  해답 2.

    select col1, ltrim(col1, 0123456789)   from t1; 
    select col1, ltrim(col1, 1234567890)   from t1;

    select col1, ltrim(col1, '0123456789') from t1;
    select col1, ltrim(col1, '0123456789') from t1 where ltrim(col1, '0123456789') is null;

문제. 연속된 숫자 5개가 포함된 행 찾기

  drop table t2 purge;
  create table t2 (col1 varchar2(40));

  insert into t2 values('이것은 12321이다');
  insert into t2 values('중요한 것은 12가 123보다 크지 않다는 것이다');
  insert into t2 values('3 곱하기 2는 6이다. 6 나누기 2는 3이다.');
  insert into t2 values('전체의 합은 76871이다');
  ...

  commit;

  grant select on t2 to public;

  select * from t2;

  해답.

    select col1, translate(col1, '0123456789', '----------') from t2;
    select col1 from t2 where translate(col1, '0123456789', '----------') like '%-----%';

    cf.http://docs.oracle.com/cd/B10501_01/server.920/a96540/functions150a.htm#79574

----------------------
 Number
----------------------

# 3-13

  select ceil(2.4), floor(2.4) 
  from dual;

  select round(45.995, 2),     -- 46 or 46.00
         round(45.995, -2),    -- 0
         round(55.995, -2),   
         round(78345.995, -2)  
  from dual;

  select to_char(round(45.995, 2), '999,999.99') as ret
  from dual;

  select dbms_random.value(1000, 2000) as ret from dual connect by level <= 100;
  select round(dbms_random.value(1000, 2000), -2) as ret from dual connect by level <= 100;

  select ret, count(*)
  from (select round(dbms_random.value(1000, 2000), -2) as ret from dual connect by level <= 100)
  group by ret
  order by ret;

  select trunc(45.995, 2),
         trunc(45.995, -2),
         trunc(55.995, -2),
         trunc(78345.995, -2)
  from dual;

  select empno,
         mod(empno, 2),
         mod(empno, 3),
         mod(empno, 5)
  from emp;

  select * from emp where mod(empno, 2) = 0;
  select * from emp where mod(empno, 3) = 0;
  select * from emp where mod(empno, 5) = 0;

# 3-14 : Dual

  @desc dual
  select * from dual;

  col dummy format a10
  select dummy from sys.dual;

  select empno, ename, 37*1.5+23545 from emp;
  select 37*1.5+23545 from emp;
  select 37*1.5+23545 from dept;

  select 37*1.5+23545 from dual;

----------------------
 Date
----------------------

# 3-17

  alter session set nls_date_format = 'DD-MON-RR';
  select sysdate from dual;
  select * from emp;
 
  alter session set nls_date_format = 'YYYY/MM/DD HH24:MI:SS';
  select sysdate from dual;
  select * from emp;

# 3-20

  select sysdate, sysdate + 1            from dual;
  select sysdate, sysdate - 3            from dual;
  select sysdate, sysdate + 5/24         from dual;
  select sysdate, sysdate + 5/(24*60)    from dual;
  select sysdate, sysdate + 5/(24*60*60) from dual;

  alter session set nls_date_format = 'DD-MON-RR';
  select empno, ename, sysdate, hiredate, ceil((sysdate - hiredate)/7) as weeks from emp;

  select sysdate, sysdate + 100, sysdate + 1000, sysdate + 10000 from dual;

  select sysdate - to_date('01-JAN-93') from dual;

  select sysdate * 3 from dual;              --> 에러 : ORA-00932: inconsistent datatypes: expected NUMBER got DATE
  select sysdate + (sysdate + 1) from dual;  --> 에러 : ORA-00975: date + date not allowed

# 3-22

  select empno, ename, sysdate, hiredate,
         months_between(sysdate, hiredate) as Month_Between1,
         ceil(months_between(sysdate, hiredate)) as Month_Between2,
         add_months(hiredate, 5)
  from emp;

  select next_day(sysdate, 'FRI') from dual;
  select next_day(sysdate, 'Mon') from dual;

  select last_day('13-FEB-11') from dual; 
  select last_day('17-FEB-12') from dual; 

# 3-24

  Day   :  1 ~ 15 : 탈락
          16 ~ 31 : 반올림

  Month :  1 ~  6 : 탈락
           7 ~ 12 : 반올림

  select empno, ename, hiredate, trunc(hiredate, 'month'), trunc(hiredate, 'year') from emp order by hiredate;
 
  select empno, ename, hiredate, trunc(hiredate, 'month'), trunc(hiredate, 'year')   --> 81년 2월에 입사한 사원
  from emp
  where trunc(hiredate, 'month') = '01-FEB-81';

  select empno, ename, hiredate, trunc(hiredate, 'month'), trunc(hiredate, 'year')   --> 82년에 입사한 사원
  from emp
  where trunc(hiredate, 'year') = '01-JAN-82';

  --> Hashing?

 

반응형