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보다는 || 연결 연산자가 좀더 표현하기도 쉽다고 생각한다.
'Study > Database' 카테고리의 다른 글
Oracle DECODE함수 (0) | 2023.06.26 |
---|---|
Null 치환 함수인 NVL 함수에 대해서 알아보자 (0) | 2023.06.21 |
[PostgreSQL] PostGreSQL 기본 CRUD 쿼리문 정리 (0) | 2023.03.15 |
MYSQL mysql column count doesn't not match value count at now 1 에러 해결 (0) | 2023.02.19 |
MYSQL Check 제약조건 (0) | 2023.01.31 |