[MySQL] 여러 열 병합하기
Posted at 2012. 8. 6. 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%") ...'보다 훨씬 낫다. 어디가 낫냐고 묻지 않길 바란다. 글 제목은 물로 있는거 아니다...
-
정식이2020.07.22 13:00오수 곡 데이터라니