본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] 4일차 - LENGTH() LENGTHB(), INSTR(), REVERSE(),

LENGTH(SMITH) → 5

 

LENGTHB('자두') → 6  (바이트 수니까)

 

 

INSTR('ORACLE ORAHOME BIORA', 'ORA', 1, 2) → 8 

: 인덱스 1에서부터 2번째 등장하는 ORA를 찾는다.

 

REVERSE('ORACLE') → ELCARO

 

SELECT USER
FROM DUAL;

--===>>SCOTT

-- ○ TBL_SAWON 테이블에서 성별이 남성인 사원만 
-- 사원번호, 사원명, 주민번호 , 급여 항목을 조회한다.
--  단, SUBSTR() 함수를 사용할 수 있도록 하며.
-- 급여 기준으로 내림차순 정렬을 수행할 수 있도록 한다.

SELECT 사원번호, 사원명, 주민번호, 급여
FROM TBL_SAWON
WHERE 성별이 남성(주민번호 7번째 자리 1개가 1 OR 3)
ORDER BY 급여 내림차순;

SELECT SANO, SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SUBSTR(JUBUN,7,1) = '1' -- 오라클에서 자동형변환을 절대 믿지 마라. 그냥 1 X
   OR SUBSTR(JUBUN,7,1) = '3' -- 오라클에서 자동형변환을 절대 믿지 마라. 
ORDER BY SAL DESC;
/*
1009	정준이	9804251234567	4000
1011	선동열	7505071234567	3000
1016	남이	7012121234567	2000
1014	남주혁	0203043234567	2000
1015	남궁선	0512123234567	1000*/

SELECT SANO, SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SUBSTR(JUBUN,7,1) IN ('1', '3')
ORDER BY SAL DESC;


-- ● LENGTH()/ LENGTHB()


SELECT LENGTHB('자두')
FROM DUAL;
--==>> 6


SELECT ENAME "1"
    ,  LENGTH(ENAME) "2"
    ,  LENGTHB(ENAME) "3"
FROM TBL_EMP;
/*
SMITH	5	5
ALLEN	5	5
WARD	4	4
JONES	5	5
MARTIN	6	6
BLAKE	5	5
CLARK	5	5
SCOTT	5	5
KING	4	4
TURNER	6	6
ADAMS	5	5
JAMES	5	5
FORD	4	4
MILLER	6	6*/
-->LENGTH()는 글자 수를 반환, LENGTHB()는 바이트 수를 반환

-- ※ 한글 데이터를 처리할 경우 바이트기반으로 
-- 처리해야만 하는 상황이라면 항상 인코딩 방식을 잘 체크하고 사용해야 한다,


--● INSTR()
SELECT 'ORCLE ORAHOME BIORA' "1"
    ,  INSTR('ORACLE ORAHOME BIORA', 'ORA', 1, 1) "2"
    ,  INSTR('ORACLE ORAHOME BIORA', 'ORA', 1, 2) "3"
    ,  INSTR('ORACLE ORAHOME BIORA', 'ORA', 2, 1) "4"
    ,  INSTR('ORACLE ORAHOME BIORA', 'ORA', 2) "5"
    ,  INSTR('ORACLE ORAHOME BIORA', 'ORA', 2, 2) ""
FROM DUAL;
--==>> ORCLE ORAHOME BIORA	1	8	8	8	18

-- 첫 번째 파라미터 값에 해당하는 문자열에서,,,(대상 문자열)
-- 두 번째 파라미터 값을 통해 넘겨준 문자열이 등장하는 위치를 찾아가
-- 세 번째 파라미터 값은 찾기 시작하는,,, ( 즉, 스캔을 시작하는 ) 위치
-- 네 번째 파라미터 값은 몇 번째 등장하는 값을 찾을 것인지에 대한 설정(1은 생략 가능)

SELECT '나의오라클 집으로오라 합니다' "1"
    , INSTR('나의오라클 집으로오라 합니다', '오라', 1) "2"
    , INSTR('나의오라클 집으로오라 합니다', '오라', 2) "3"
    , INSTR('나의오라클 집으로오라 합니다', '오라', 10) "4"
    , INSTR('나의오라클 집으로오라 합니다', '오라', 11) "5"
FROM DUAL;
--> 마지막 파라미터 ( 네 번째 파라미터) 값을 생략한 형태로 사용!! → 1
--==>> 나의오라클 집으로오라 합니다	3	3	10	0


-- ● REVERSE()     ---- 대상 문자열 (매개변수)을 거꾸로 반환한다.(단, 한글은 제외)
SELECT 'ORACLE' "1"
    ,  REVERSE('ORACLE') "2"
    ,  REVERSE('오라클') "3"
FROM DUAL;

--==>>ORACLE	ELCARO	���


--● 실습 대상 테이블 생성(TBL_FILES)

CREATE TABLE TBL_FILES
( FILENO    NUMBER(3)
,  FILENAME VARCHAR2(100)
);

--==>>Table TBL_FILES이(가) 생성되었습니다.

--● 실습 데이터 입력
INSERT INTO TBL_FILES VALUES (1, 'C:\AAA\BBB\CCC\SALES.DOC');
INSERT INTO TBL_FILES VALUES (2, 'C:\AAA\PANMAE.XXLS');
INSERT INTO TBL_FILES VALUES (3, 'D:\RESEARCH.PPT');
INSERT INTO TBL_FILES VALUES (4, 'C:\DOCUMENTS\STUDY.HWP');
INSERT INTO TBL_FILES VALUES (5, 'C:\DOCUMENTS\TEMP\SQL.TXT');
INSERT INTO TBL_FILES VALUES (6, 'D:\SHARE\F\TEST.PNG');
INSERT INTO TBL_FILES VALUES (7, 'C:\USER\GUILDONG\PICTURE\PHOTO\SPRING.JPG');
INSERT INTO TBL_FILES VALUES (8, 'C:\ORABLESTUDY\20210329_01_SCOTT.SQL');

--==>> 1 행 이(가) 삽입되었습니다. * 8
SELECT *
FROM TBL_FILES;
/*
1	C:\AAA\BBB\CCC\SALES.DOC
2	C:\AAA\PANMAE.XXLS
3	D:\RESEARCH.PPT
4	C:\DOCUMENTS\STUDY.HWP
5	C:\DOCUMENTS\TEMP\SQL.TXT
6	D:\SHARE\F\TEST.PNG
7	C:\USER\GUILDONG\PICTURE\PHOTO\SPRING.JPG
8	C:\ORABLESTUDY\20210329_01_SCOTT.SQLL*/

-- ● 커밋
COMMIT;
--==>>>커밋 완료.


SELECT FILENO "파일번호", FILENAME "파일명"
FROM TBL_FILES;
/*
파일번호  파일명
--- ----------------------------------
1	C:\AAA\BBB\CCC\SALES.DOC
2	C:\AAA\PANMAE.XXLS
3	D:\RESEARCH.PPT
4	C:\DOCUMENTS\STUDY.HWP
5	C:\DOCUMENTS\TEMP\SQL.TXT
6	D:\SHARE\F\TEST.PNG
7	C:\USER\GUILDONG\PICTURE\PHOTO\SPRING.JPG
8	C:\ORABLESTUDY\20210329_01_SCOTT.SQL*/

 

 

 

 

▼ 문자열에서 마지막으로 등장하는 ' \ ' 찾기

/*
파일번호  파일명
--- ----------------------------------
1	C:\AAA\BBB\CCC\SALES.DOC
2	C:\AAA\PANMAE.XXLS
3	D:\RESEARCH.PPT
4	C:\DOCUMENTS\STUDY.HWP
5	C:\DOCUMENTS\TEMP\SQL.TXT
6	D:\SHARE\F\TEST.PNG
7	C:\USER\GUILDONG\PICTURE\PHOTO\SPRING.JPG
8	C:\ORABLESTUDY\20210329_01_SCOTT.SQL*/



-- ● TBL_ FILES 테이블을 대상으로 파일명.확장자 가 조회될 수 있도록
--쿼리문을 구성한다.


--SUBSTRING(파일명, 마지막\위치+1, 끝까지)



SELECT INSTR(REVERSE('C:\AAA\BBB\CCC\SALES.DOC'),'\',1)
FROM DUAL; --==>> 10

SELECT LENGTH('C:\AAA\BBB\CCC\SALES.DOC')
FROM DUAL; --==>>24   

-- /의 위치는 15, 즉 24-10+1 에 위치하고 있다. 


SELECT SUBSTR('C:\AAA\BBB\CCC\SALES.DOC'
,LENGTH('C:\AAA\BBB\CCC\SALES.DOC')-INSTR(REVERSE('C:\AAA\BBB\CCC\SALES.DOC'),'\',1)+2
)
FROM DUAL;

--==>>> SALES.DOC

SELECT FILENO "파일번호" , SUBSTR(FILENAME
,LENGTH(FILENAME)-INSTR(REVERSE(FILENAME),'\',1)+2
) "파일명"
FROM TBL_FILES;

/*
파일번호  파일명
--  ----------------
1	SALES.DOC
2	PANMAE.XXLS
3	RESEARCH.PPT
4	STUDY.HWP
5	SQL.TXT
6	TEST.PNG
7	SPRING.JPG
8	20210329_01_SCOTT.SQL*/

 

 

 

 

▼ 또 다른 풀이

 

SELECT SUBSTR(REVERSE(FILENAME), 1, INSTR(REVERSE(FILENAME), '\',1)-1)
FROM TBL_FILES;
/*
COD.SELAS
SLXX.EAMNAP
TPP.HCRAESER
PWH.YDUTS
TXT.LQS
GNP.TSET
GPJ.GNIRPS
LQS.TTOCS_10_92301202*/

SELECT REVERSE(SUBSTR(REVERSE(FILENAME), 1, INSTR(REVERSE(FILENAME), '\',1)-1))
FROM TBL_FILES;
/*
SALES.DOC
PANMAE.XXLS
RESEARCH.PPT
STUDY.HWP
SQL.TXT
TEST.PNG
SPRING.JPG
20210329_01_SCOTT.SQL*/