Конкатенация MySQL при наличии пустых полей - PullRequest
0 голосов
/ 09 октября 2011

Я создал ВИД, используя этот код:

CREATE OR REPLACE VIEW aaa AS

   SELECT pry.uid, 
          treg.nombre_es as region, 
          tpais.nombre_es as pais, 
          tdep.departamento, 
          dep_other, tciu.ciudad, 
          ciu_other
     FROM tx_oriproyectos_proyectos AS pry
LEFT JOIN tx_oritablascomunes_regiones as treg ON pry.region = treg.uid
LEFT JOIN tx_oritablascomunes_paises as tpais ON pry.pais = tpais.uid
LEFT JOIN tx_oritablascomunes_departamentos as tdep ON pry.departamento = tdep.uid
LEFT JOIN tx_oritablascomunes_ciudades as tciu ON pry.ciudad = tciu.uid

И я получил это, и все в порядке:

результат http://finewebdesigns.com/images/mysql_view_result.jpg

И теперь мне нужно получитьобъединить результаты, как это:

concatenated_field
---------------------------------------
Africa - ALbania - Tirana1 - Tirana2
Africa - Colombia - Guaviare - Calamar

Как я могу это сделать?


Я пробовал это:

CREATE OR REPLACE VIEW aaa AS

SELECT CONCAT_WS (' - ', pry.uid, treg.nombre_es as region, tpais.nombre_es as pais, tdep.departamento, dep_other, tciu.ciudad, ciu_other)
FROM tx_oriproyectos_proyectos AS pry
LEFT JOIN tx_oritablascomunes_regiones as treg
ON pry.region=treg.uid
LEFT JOIN tx_oritablascomunes_paises as tpais
ON pry.pais=tpais.uid
LEFT JOIN tx_oritablascomunes_departamentos as tdep
ON pry.departamento=tdep.uid
LEFT JOIN tx_oritablascomunes_ciudades as tciu
ON pry.ciudad=tciu.uid

Но я получил:

#1583 - Incorrect parameters in the call to native function 'CONCAT_WS'

Хорошо, благодаря @Mat я наконец-то получил этот код, который является ожидаемым решением этой проблемы.

CREATE OR REPLACE VIEW aaa AS

SELECT pry.uid, CONCAT_WS (' - ', treg.nombre_es, tpais.nombre_es, tdep.departamento, NULLIF(dep_other,''), tciu.ciudad, NULLIF(ciu_other,''))
FROM tx_oriproyectos_proyectos AS pry
LEFT JOIN tx_oritablascomunes_regiones as treg
ON pry.region=treg.uid
LEFT JOIN tx_oritablascomunes_paises as tpais
ON pry.pais=tpais.uid
LEFT JOIN tx_oritablascomunes_departamentos as tdep
ON pry.departamento=tdep.uid
LEFT JOIN tx_oritablascomunes_ciudades as tciu
ON pry.ciudad=tciu.uid

, который получает это: http://finewebdesigns.com/images/mysql_view_result_solved.jpg

1 Ответ

3 голосов
/ 09 октября 2011

Вы должны использовать строковую функцию CONCAT_WS.

SELECT CONCAT_WS(' - ', treg.nombre_es, tpais.nombre_es, ...) FROM ...

Из документов:

CONCAT_WS () не пропускает пустые строки. Однако он пропускает любые значения NULL после аргумента разделителя.

так что ваши нулевые значения будут просто игнорироваться.

Если вы также хотите пропустить пустые строки, вы можете использовать функцию выброса NULLIF в миксе, как рекомендует ypercube :

SELECT CONCAT_WS(' - ', NULLIF(col,''), ...) ...
...