n개의 row 로 결과가 출력되는 쿼리를 한 줄의 row에 표현하고 싶은 경우, GROUP_CONCAT을 사용한다.

* SELECT GROUP_CONCAT('칼럼명' SEPARATOR '구분문자')

   FROM 테이블명

 

예를 들어,

쿼리 :

1
2
SELECT user_id AS result 
  FROM user_info;
cs

결과 :

result
user1
user2
user3

 

n개의 로우가 출력되는 쿼리에 GROUP_CONCAT 사용시,

쿼리:

1
2
SELECT GROUP_CONCAT(user_id SEPARATOR '^') AS result 
  FROM user_info;
cs

결과 :

result
user1^user2^user3

위처럼 하나의 row에 구분자를 기준으로 모든 row가 붙어서 출력된다.

* GROUP_CONCAT('데이터' ORDER BY '정렬기준' desc SEPARATOR '구분자') 와 같이 order by 사용도 가능.

 

* 응용

1
2
3
4
5
6
7
SELECT COUNT(*)
  FROM sample_table
 WHERE json_data REGEXP (
                         SELECT GROUP_CONCAT(user_id SEPARATOR '|') AS result 
                           FROM user_info
 );
 
cs

적절한 예인지 모르겠으나, 위와 같이 복수개의 문자열에 대한 LIKE 조건을 건 것 처럼 사용 할 수도 있지 않을까..

* jstl 을 사용한 클라이언트단에서의 출력

 

1
2
3
4
5
6
<td>
    <c:set var="user_id" value="${fn:split(list.user_id, '^')}" />
    <c:forEach var="obj" items="${user_id}" varStatus="idx">
    ${obj}<c:if test="${!idx.last}"><br></c:if>
    </c:forEach>
</td>
cs

 

※ ORACLE

LISTAGG(column, 'separator') WITHIN GROUP(ORDER BY column)

1
2
SELECT LISTAGG(user_id, ',') WITHIN GROUP(ORDER BY user_id) AS result
FROM user_info
cs

 

반응형

+ Recent posts