[MySQL] 여러 열 병합하기

Posted at 2012.08.06 23:11 | Posted in 프로그래밍

MYSQL에서 여러 열을 병합하기 위해서는 concat() 이나 concat_ws()를 써야되는데, 이 둘의 차이점은 레코드에 NULL값이 있을 때 확인할 수 있다.

아래에 열 병합을 시도할 데이터가 준비되어있다.

mysql> select b.name as artist, a.title, e.title as source
    -> from osu_beatmaps a
    -> left join osu_beatmap_artists b on (a.artist = b.idx)
    -> left join osu_beatmap_creators c on (a.creator = c.id)
    -> left join osu_beatmap_sources d on (a.id = d.pid)
    -> left join osu_beatmap_source_list e on (d.source = e.idx)
    -> order by a.date desc limit 120, 10;
+----------------+---------------------------+----------------------------+
| artist         | title                     | source                     |
+----------------+---------------------------+----------------------------+
| IOSYS          | Utage wa Eien ni ~SHD~    | Touhou Suisui Suusuu       |
| Hatsune Miku   | Atama no Taisou           | hapi                       |
| wa. vs ETIA.   | Akasagarbha               | NULL                       |
| Coldplay       | Charlie Brown             | NULL                       |
| Igorrr         | Mastication Numerique     | NULL                       |
| Hatsune Miku   | Cruel Clocks              | CON                        |
| Chihara Minori | Tsuuka Chiten no Musica   | Suzumiya Haruhi no Yuuutsu |
| Yanaginagi     | Killer Song               | NULL                       |
| Naoko Hamasaki | Tensai Wa Saigo Yattekuru | Those Who Hunt Elves       |
| Sakakibara Yui | Scarlet                   | DRACU-RIOT!                |
+----------------+---------------------------+----------------------------+
10 rows in set (0.03 sec)

이 데이터를 "artist - title (source)"과 같은 형식으로 뽑아오려면 어떻게 해야할까?


먼저 concat()을 사용해보자.

mysql> select concat(b.name, " - ", a.title, " (", e.title, ")") ...;
+-----------------------------------------------------------------------+
| concat(b.name, " - ", a.title, " (", e.title, ")")                    |
+-----------------------------------------------------------------------+
| Duca - Futari (Short Ver.) (Haruka na Sora)                           |
| IOSYS - Utage wa Eien ni ~SHD~ (Touhou Suisui Suusuu)                 |
| Hatsune Miku - Atama no Taisou (hapi)                                 |
| NULL                                                                  |
| NULL                                                                  |
| NULL                                                                  |
| Hatsune Miku - Cruel Clocks (CON)                                     |
| Chihara Minori - Tsuuka Chiten no Musica (Suzumiya Haruhi no Yuuutsu) |
| NULL                                                                  |
| Naoko Hamasaki - Tensai Wa Saigo Yattekuru (Those Who Hunt Elves)     |
+-----------------------------------------------------------------------+
10 rows in set (0.03 sec)

NULL이 같은 행의 레코드들을 먹는 뭐같은 상황이 벌어졌다.


다음은 concat_ws()를 사용해보자.

mysql> select concat_ws("", b.name, " - ", a.title, " (", e.title, ")") ...;
+-----------------------------------------------------------------------+
| concat_ws("", b.name, " - ", a.title, " (", e.title, ")")             |
+-----------------------------------------------------------------------+
| Duca - Futari (Short Ver.) (Haruka na Sora)                           |
| IOSYS - Utage wa Eien ni ~SHD~ (Touhou Suisui Suusuu)                 |
| Hatsune Miku - Atama no Taisou (hapi)                                 |
| wa. vs ETIA. - Akasagarbha ()                                         |
| Coldplay - Charlie Brown ()                                           |
| Igorrr - Mastication Numerique ()                                     |
| Hatsune Miku - Cruel Clocks (CON)                                     |
| Chihara Minori - Tsuuka Chiten no Musica (Suzumiya Haruhi no Yuuutsu) |
| Yanaginagi - Killer Song ()                                           |
| Naoko Hamasaki - Tensai Wa Saigo Yattekuru (Those Who Hunt Elves)     |
+-----------------------------------------------------------------------+
10 rows in set (0.03 sec)

원하는대로 NULL은 빈칸으로 대체되어 데이터를 뽑아온다.

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat


요딴식으로 데이터 검색을 하는게 '(b.name like "%query1%") and (b.name like "%query2%") or (a.title like "%query1%") ...'보다 훨씬 낫다. 어디가 낫냐고 묻지 않길 바란다. 글 제목은 물로 있는거 아니다...

저작자 표시 비영리
신고

Name __

Password __

Link (Your Website)

Comment