<목표>
EMPLOYEE 테이블에서 EMAIL 조회 시, sun_di@or.kr이 아닌 sun_di ( == 아이디)만 조회하고 싶다.
<시행착오...ㅎ>
접근1
SUBSTR 함수를 이용해서 '@'를 찾아 그 이전까지만 추출하고 싶었다.
SELECT EMP_NAME,SUBSTR(EMAIL,1,'@')FROM EMPLOYEE;
결과값=> 실패
ORA-01722: invalid number
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.
=> 이유 SUBSTR 함수의 매개변수 데이터 타입을 보자,
SUBSTR(STRING,POSITON[,LENGTH]) 인데, 위의 경우 마지막 매개변수인 LENGTH에 '@' (== CHAR데이터 타입)을 입력해서 생긴 오류이다.
=> 하지만, 아이디마다 '@'의 위치가 모두 다르기 때문에 SUBSTR 함수만으로는 불가능하다
=> INSTR 함수를 같이 사용해보면 어떨까?
접근2
INSTR 함수를 이용해서 '@' 의 위치에 접근하고, 그 위치 이전까지의 값만을 출력하고자한다.
SELECT EMP_NAME,SUBSTR(EMAIL,1,INSTR(EMAIL,'@'))
FROM EMPLOYEE;
결과값 => 실패
선동일 sun_di@
송종기 song_jk@
노옹철 no_hc@
송은희 song_eh@
유재식 yoo_js@
=> 내가 원하는 값은 '@' 포함이 아닌 이전까지의 값이다.
접근3
'@'의 이전까지의 값이 필요하니 '@-1'을 해보면 어떨까?
SELECT EMP_NAME,SUBSTR(EMAIL,1,INSTR(EMAIL,'@-1'))
FROM EMPLOYEE;
결과값 => 실패
선동일 (null)
송종기 (null)
노옹철 (null)
송은희 (null)
유재식 (null)
=> null 값이 출력된다.
==> @+1로 바꿔봐도 마찬가지이다.
이유 : '@-1'은 말그대로 @-1이라는 값을 찾기 때문에 null이 표시된다
접근4
SUBSTR(STRING,POSITION[,LENGTH])를 활용해서 LENGTH 에 -1을 입력한다면?
SELECT EMP_NAME,SUBSTR(EMAIL,1,INSTR(EMAIL,'@')-1)
FROM EMPLOYEE;
결과값 => 성공
선동일 sun_di
송종기 song_jk
노옹철 no_hc
송은희 song_eh
유재식 yoo_js
=> 이메일 전체가 아닌, 아이디만 조회되는 것을 확인했다.
<결론>
1. SUBSTR(STRING,POSITION[,LENGTH]) 즉, STRING,NUM,NUM 데이터 타입을 활용하기
2. LENGTH에서 문자열로부터 특정 문자의 위치 찾아서 해당 위치값 반환하는 함수인
INSTR(STRING,'문자'[,찾을위치의 시작값[,순번]])을 활용하기
3. '@'포함시키지 않기 위해서 찾은 문자열의 위치에서 -1를 빼기
+) 21/03/11 추가
새로운 접근 방법을 알게 되었다.
바로 RTRIM 함수를 사용하는 것인데,
[복습] RTIM이란?
특정 문자열을 찾아서, 트리밍 ( 제거 ) 해주는 함수로, RTRIM 과 LTRIM이 있다. 각각 오른쪽, 왼쪽 문자열을 제거하는 함수이다. => 더 나아가 양쪽 문자열을 제거하는 TRIM이라는 함수도 있다. 모두 CHAR 타입으로 결과값을 반환한다.
'🚨 Error > ORACLE' 카테고리의 다른 글
[Oracle] 비등가 조인을 활용하여 문제 풀기 (0) | 2021.03.12 |
---|---|
[Oracle] 두 개이상의 테이블을 외부조인 하는 방법 (0) | 2021.03.12 |
[Oracle] 같은 문제에 DECODE 와 CASE WHEN THEN 적용해보기 (0) | 2021.03.09 |
[Oracle] WHERE절에서 와일드카드 기술하기 (0) | 2021.03.05 |
[Oracle] 보너스 포함 연봉 칼럼에 '원'이라는 리터럴 값 제시 (0) | 2021.03.04 |
댓글