11일차 4
나중에 다시 정리할거야..
>> 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