Programming/SQL

문자열 함수 LOWER,UPPER, PAD, INSTR. 2021-07-30

최동훈1 2021. 7. 30. 16:39

우선 그나마 실용적으로 쓰이는 함수는 LOWER과 UPPER이다. 일단 칼럼 제한 조건부분에서는 칼럼명은 소문자로 쓰든 대문자로 쓰든 오라클에서는 대/소 문자를 구별하지 않지만, WHERE 절 뒤 ROW를 제한하는 조건을 쓸떄 비교연산자 '=' 을 쓰는 경우에는 문자 리터럴로 대/소문자를 구별한다.  이떄 대/소 문자 가리지않고 ROW를 제한하는 방법에 이것을 쓴다.

예를 들면,

이렇게 HUN이라는 이름속에는 대/소문자가 혼재되어 있을경우 구별없이 출력하고자한다면 어떤 쿼리를 써야 할까?

select name||id as "이름(회사명)" from member where UPPER(name)='HUN';

이렇게 해당 칼럼을 아예 대문자로 다 바꾼뒤에 비교연산자 '='를 통해 비교하면 된다.

그다음 많이쓰는 함수는 패딩함수인 PAD 이다. 예를들면 이름이 외자인 경우 뒤에 '자' 를 붙여서 출력하라. 라는 경우가 있을 경우 쓰인다.

이경우 한글로 3자리를 맞추되, 남은 자리는 '자' 로 채우려고 나는 쿼리를 쓰였다. 이전에도 많이 이것때문에 골머리 앓은적이 있어서인지, 이것은 nationalcharacterset이 아니므로 "아! 한글은 1글자당 3바이트로 쓰이겠구나!" 라는 생각에 이런 쿼리를 짰다.

select RPAD(name, 3, "자") from member;

그럼 한글은 1글자만 출력이 되야 내 가설이 맞겠네? 하고 출력을 해보니.

이렇게 나왔다. 어? 이상했다. 분명 한글이 한글자당 3바이트라면, 뒤에 . 과 a 는 왜 출력된 것일까? 여기서 패딩함수에서는 한글을 1글자당 2바이트로 nationalcharacter 기준에 맞춘다는 것을 알게 되었다.

이유는 나도 모르겠다..

 

또 문자열 검색 함수인 INSTR 함수도 많이 쓰인다. 

예를들면 위 테이블의 ID 중 M이 몇번째 자리에 존재하는지 알고싶다면

select INSTR(id,'M') from member where id like 'S%';

이렇게 나온다.

select INSTR(id,'M') from member where REGEXP_LIKE(id,'^[sS]');

이렇게 정규식으로 조금더 정교하게 검색도 가능하다.

 

오후공부시간 2시간.

오후 순공부시간 40분.

 

오늘 총 1시간 40분정도 공부한거 같다.

당근마켓에서 킥보드 거래중인데 빨리사고싶다 ㅎㅎ