본문 바로가기
Study/Database

Oracle CONCAT에 대해서 알아보자.

by 얏옹이 2023. 6. 20.
반응형

Oracle database에서는 || 연결 연산자를 이용하여 문자열을 이어 붙일수 있다.

 

은근히 쓰일일이 없다고 생각할수 있지만, 꼭 그렇게 생각하고 있으면 은근히 쓰일일이 많다. 사실 database 안에서 직접적으로 쓸일은 그동안 경험상 많이 없었다.

 

개인적으로 난 DB를 연동해서 웹개발을 하면, Spring에서 Mybatis를 이용하여 쿼리문을 날릴때 종종 사용하곤 한다.

 

mybatis는 Mapper.xml에 입력된 쿼리문과 쿼리 id를 가지고 그 id를 호출하여 상황에 맞게 쿼리문을 수행하게 되는데.

 

이때 동적으로 사용자가 입력한 값(Parameter)를 이용하여 쿼리문의 조건이나 조회할 값들이 수시로 변경되기 때문에

 

동적쿼리문을 사용해야한다.

 

아래의 쿼리문은 어제 작성해본 쿼리문이다.

 

반응형
		select *
		from board_list
		<where>
			<if test="status != null and status != ''">
				title like '%'||#{title}||'%' and status = #{status}
			</if>
			<if test="status == null and status == ''">
				title like '%'||#{title}||'%'
			</if>
		</where>

 

게시판 검색 기능을 구현한 쿼리인데, 넘어오는 값이 1개이냐 2개이냐에 따라서 쿼리문을 각각 달라지게 표현하였다.

 

여기에서 오늘의 중요포인트가 바로 '%#{title}%' 부분이다. 이 부분은 %과 #{title}과 % 총 3개로 이루어진 문자열이 합쳐지기때문에 Concat을 사용하지않고 || 연결연산자를 사용하였다.

 

이유는 Concat의 문자열 인자는 2개여야 하기 때문이다. 앞서 mapper 쿼리문에 대해서 설명한것은 주로 동적쿼리문을 사용할때, Concat을 많이 사용한다.

 

Concat의 기본 문법은 아래와 같다.

 

Concat(String1, String2)

 

 

그리고 이런식으로 

 

select *
from board_user
where id = concat('abc1','@naver.com');

 사용하면 이것은 즉

 

select *
from board_user
where id = 'abc1@naver.com';

 

와 결과가 같다. 즉 문자열 연결이 되어서 abc1 과 @naver.com이 합쳐져 abc1@naver.com의 where문 조건 파라미터가 되는것이다.

 

단 문자열 인자가 2개까지만 가능하다는 점은 조금 아쉽다.

 

따라서 3개로 처리하려면 중복해서 Concat문을 사용해주거나, 일반 연결 연산자인 || 을 사용해준다.

 

select *
from board_user
where id = concat('abc1',concat('@','naver.com'));

이런식으로 괄호를 이용하여 우선시 문자열을 먼저 합쳐주고, 그 후 다시 문자열을 합쳐주는 식으로 사용도 가능하다.

 

select *
from board_user
where id = 'abc1'||'@'||'naver.com';

 

하지만 개인적으로 3개 이상의 문자열을 합칠때는 Concat보다는 || 연결 연산자가 좀더 표현하기도 쉽다고 생각한다.

반응형