Oracle/11일

11일차 4

Caprica Six 2012. 9. 20. 10:01

나중에 다시 정리할거야..

>> Regular Expressions (정규 표현식) 사용

Using Regular Expressions in Database Applications :
http://docs.oracle.com/cd/E11882_01/appdev.112/e25518/adfns_regexp.htm#ADFNS1003

정규표현식이 머냐면..

http: https: ftp: ftps: 이 4개를 한방에 표현하면..
(f|ht)tps?:
뭐 이런거야..

정규표현식의 사용이 늘어나고 있어...


>REGEXP_LIKE
  SELECT *
  FROM employees
  WHERE REGEXP_LIKE(first_name, '^Ste(v|ph)en$');
  -- ^:시작, (v|ph): v아니면 ph, $:끝
 

    cf. dual Table : 데이터 한건 들어있는 dummy table.
        운영자가 가지고 있는 table이지만 권한이 public이라 모두 사용할 수 있다.
       
        SELECT sysdate FROM employees; --데이터 여러건 발생. 필요없잖아.
        SELECT sysdate FROM dual;    -- 데이터 한건만 발생. 이렇게 사용하라고 만든겨.
       
>REGEXP_COUNT :
  select REGEXP_COUNT('Albert Einstein', 'e', 7, 'c')
  from dual;
    -- 7번째 글짜부터 'e'를 검색해서 갯수리턴. 'c:대소문자구분'
   
  --REGEXP_INSTR
  select
    REGEXP_INSTR('oraclejava@naver.com', '\w+@\w+(\.\w+)+'),
    REGEXP_INSTR('oraclejava@navercom', '\w+@\w+(\.\w+)+'),
    REGEXP_INSTR('oraclejavanaver.com', '\w+@\w+(\.\w+)+'),
    REGEXP_INSTR('oraclejava@.com', '\w+@\w+(\.\w+)+')
  from dual;
  --문자열이 패턴과 같으면 1 아니면 0
 
 
>REGEXP_REPLACE
  SELECT
  phone_number,
  REGEXP_REPLACE(phone_number,
                 '([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})',
                 '(\1) \2-\3') "REGEXP_REPLACE"
  FROM employees
  ORDER BY "REGEXP_REPLACE";
 
  SELECT
  country_name,
  REGEXP_REPLACE(country_name, '(.)', '\1 ') "REGEXP_REPLACE"
  FROM countries;

  SELECT
  REGEXP_REPLACE('500   Oracle     Parkway,    Redwood  Shores, CA',
                 '( ){2,}', ' ') "REGEXP_REPLACE"
  FROM DUAL;
 
>REGEXP_SUBSTR
 
 
 
 
 
 
 
  --SELECT할때 enter로 입력한거 </br>로 바꾸기
  select replace(content, chr(13)||chr(10), '<br/>') as 내용 --'/r''/n'
  from board
  where seq=18;
 
  select REGEXP_REPLACE(content, chr(13)||chr(10), '<br/>') as 내용
  from board --/r/n
  where seq=18;
 
 
 
 
>전화번호 포멧을 제약조건으로 주기.
  클라이언트단에서의 체크는 사용자의 편의성을 제공하기 위한것일 뿐,
  서블릿이나 액션클래스에서 검증 or 데이터베이스에서 제약조건을 주는 것이 있겠지.
 
  디비에서 제약조건 줘보자. ((XXX) XXX-XXXX)
  CREATE TABLE contacts (
  l_name    VARCHAR2(30),    -- 이름
  p_number  VARCHAR2(30)  -- 전화번호
  CONSTRAINT c_contacts_pnf --제약조건의 이름줘.
  CHECK (REGEXP_LIKE (p_number, '^\(\d{3}\) \d{3}-\d{4}$'))
);

    제약조건을 나중에 찾아야 할 수도 있기때문에 이름을 붙여놨어.
    제약조건 이름의 관례
        제약조건형태_테이블명_컬럼명
            CHECK:c,ck
            NOT NULL:nn
            PRIMARY KEY:pk
            FOREIGN :fk
           
    제약조건 검색하는 법
  SELECT * FROM user_constraints WHERE constraint_name = 'c_contacts_pnf';
 
  제약조건의 이름주
 
  INSERT INTO contacts (p_number) VALUES('(650) 555-0100');
  INSERT INTO contacts (p_number) VALUES('(215) 555-0100');
  --성공
 
  SELECT * FROM contacts;
 
  INSERT INTO contacts (p_number) VALUES('650 555-0100');
  INSERT INTO contacts (p_number) VALUES('650 555 0100');
  INSERT INTO contacts (p_number) VALUES('650-555-0100');
  INSERT INTO contacts (p_number) VALUES('(650)555-0100');
  INSERT INTO contacts (p_number) VALUES(' (650) 555-0100');
  --CHECK제약조건에 걸려서 에러발생
 
 

  --Using Back References to Reposition Characters
  CREATE TABLE famous_people (names VARCHAR2(20));
  INSERT INTO famous_people (names) VALUES ('John Quincy Adams');
  INSERT INTO famous_people (names) VALUES ('Harry S. Truman');
  INSERT INTO famous_people (names) VALUES ('John Adams');
  INSERT INTO famous_people (names) VALUES (' John Quincy Adams');
  INSERT INTO famous_people (names) VALUES ('John_Quincy_Adams');
  select * from famous_people;
 
  SELECT names "names",
    REGEXP_REPLACE(names, '^(\S+)\s(\S+)\s(\S+)$', '\3, \1 \2')
    AS "names after regexp"
  FROM famous_people
  ORDER BY "names";
 
   names              names after regexp
------------------ ------------------
  John Quincy Adams  John Quincy Adams
Harry S. Truman    Truman, Harry S.
John Adams         John Adams
John Quincy Adams  Adams, John Quincy
John_Quincy_Adams  John_Quincy_Adams
 
 
 
  SELECT names "names",
    REGEXP_REPLACE(trim(names), '^(\S+)\s(\S+)\s(\S+)$', '\3, \1 \2')
    AS "names after regexp"
  FROM famous_people
  ORDER BY "names";
 
   names              names after regexp
------------------ ------------------
  John Quincy Adams Adams, John Quincy
Harry S. Truman    Truman, Harry S.
John Adams         John Adams
John Quincy Adams  Adams, John Quincy
John_Quincy_Adams  John_Quincy_Adams