Mysql et la recherche sur plusieurs champs : avec CONCAT ou CONCAT_WS

Publié dans SQL | Marqué avec , , , , ,
Share

Après avoir parlé un peu de la recherche en MySQL via LIKE puis REGEXP, et avant d’aller plus loin, parlons un peu de la recherche dans plusieurs champs à la fois. Eh oui, c’est possible grâce à CONCAT, ou plutôt CONCAT_WS.
Prenons une table contenant les billets d’un blog, et donc possédant les champs id, titre et contenu. Une recherche classique cherchera un mot clef dans le titre et dans le contenu du billet. Pour cela, on pourrait utiliser OR, mais un CONCAT qui concatène (i.e. met l’un à la suite de l’autre) le contenu de titre et de contenu, c’est pas mal aussi ! Exemple à l’appui :

SELECT * FROM billet WHERE CONCAT(titre, contenu) LIKE "%mot%clef%";

On peut ainsi concaténer autant de champs que l’on souhaite. Un petit détails cependant, si l’un de ces champs est NULL, le résultat renvoyé est NULL. Ce qui implique qu’un article sans titre dont le contenu correspond au mot clef, ne sera pas récupérée. Même si l’exemple est débile, c’est un peu dommage. Pour éviter cela, il convient d’utiliser CONCAT_WS qui fonctionne de la même manière, sans se soucier des champs vides.
Le deuxième exemple ci-dessous est certes moins compréhensible, mais il illustre ce dont nous venons de parler, et explique bien l’intérêt d’utiliser CONCAT plutôt que OR dans certains cas.

SELECT * FROM billet WHERE CONCAT_WS(date, ' ', heure, 'h', minute) LIKE "10/11/2009 23h30";

Bien sûr, il est possible d’utiliser la commande REGEXP au lieu de LIKE ! Bref, vive la concaténation !

Puisque ses rétroliens ne semblent pas fonctionner, merci à CrazyCat de G33k-zone pour m’avoir fait découvrir cette commande SQL bien utile.

3 réponses à Mysql et la recherche sur plusieurs champs : avec CONCAT ou CONCAT_WS

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*