OVH Cloud OVH Cloud

concatener des des champs de plusieurs record

13 réponses
Avatar
WebShaker
Salut.

J'utilise postgreSQL 8.3

j'aimerai savoir s'il est possible de concatener des champs de plusieurs
record.
Je m'explique.
Supposons que j'ai un table contenant des albums

j'aimerai obtenir une chaine contenant la liste des albums d'un auteur
dans un seul champs... alors qu'évidement chaque album est dans un
record différent.

Est il possible de faire ca en SQL?

Merci
Etienne

3 réponses

1 2
Avatar
helios
Alain Montfranc a écrit :
Il se trouve que helios a formulé :
SQLpro a écrit :
Dominique Ottello a écrit :
"WebShaker" écrivait :

Bon j'aurai préféré une solution SQL plutot qu'un truc
propriétaire, mais ca va le faire quand meme.



Si MySQL : GROUP_CONCAT



Ceci est spécifique à MySQL et n'existe pas en tant que norme SQL. De
plus c'est une fonction imbécile car particulièrement anti
relationnelle !

Vous pouvez en revanche utiliser la CTE (Common Table Expression) qui
introduit les requêtes récursives.
Aidez vous des exemples que j'ai donné dans mon cours à ce sujet :
http://sqlpro.developpez.com/cours/sqlserver/cte-recursives/
et en particulier de l'exemple IV-D :
http://sqlpro.developpez.com/cours/sqlserver/cte-recursives/#LIV-D

A +




est il imbecile de pretendre comme un certain auteur de livres sur SQL
mettre toute les dates jusqu'à nos jours depuis Jésus christ codé sur
2 octet?



Lui au moins il a été capable d'écrire un livre ET de le publier....




framabook permet a n'importe quel imbecile de publier les ecrits qu'il
veut donc cela n'est pas une reference d'inteligence
Avatar
Serguei Tarassov
On 31/01/2010 22:01, WebShaker wrote:
Salut.

J'utilise postgreSQL 8.3

j'aimerai savoir s'il est possible de concatener des champs de plusieurs
record.
Je m'explique.
Supposons que j'ai un table contenant des albums

j'aimerai obtenir une chaine contenant la liste des albums d'un auteur
dans un seul champs... alors qu'évidement chaque album est dans un
record différent.

Est il possible de faire ca en SQL?



Salut,

En cas commun ce n'est pas possible, mais en cas particulier dépendante
de SGDB cela peut être possible.

I.e. en MS SQL Server
DECLARE @str nvarchar(max);
SET @str = ''; -- string vide
SELECT @str = @str + Champ1 + Champ2 + ...
FROM MonTable;
PRINT @str;

Attention, ce hack est assez dangereux ;)

Je crois qu'en PostgreSQL les trucs de ce genre sont aussi possibles.

A la limite, tu peux toujours utiliser les curseurs rapides (read only,
fas forward etc.) ou même le boucle WHILE par les lignes d'une table en
utilisant la clé primaire.

A+
Serguei TARASSOV
MCITP SQL Server Dev/DBA
http://sgbd.arbinada.com
Avatar
SQLpro
Dominique Ottello a écrit :
SQLpro écrivait :

Si MySQL : GROUP_CONCAT


Ceci est spécifique à MySQL et n'existe pas en tant que norme SQL. De
plus c'est une fonction imbécile car particulièrement anti relationnelle !



J'avais bien écrit : Si MySQL Que ce soit une fonction « imbécile »,
peut-être.

Néanmoins, pourriez-vous m'indiquer comment réécrire la requête
ci-dessous, sans utiliser GROUP_CONCAT. Étant entendu que je ne peux
utiliser :
- que MySQL 5.1.xx
- que des tables MyISAM
- pas de procédures stockées

SELECT L.b_image, L.b_texte, L.b_mini, L.b_annexe,
GROUP_CONCAT(CONCAT_WS('^',A.a_num,A.a_image,A.a_texte,A.a_impos)
ORDER BY A.a_num SEPARATOR 'n') AS liste_annexes
FROM avia_bib_livres AS L
LEFT OUTER JOIN avia_bib_annexes AS A ON A.a_id = L.b_id
WHERE L.b_ordre = '$numero'
GROUP BY L.b_id



Vous ne pouvez pas avec MySQL.

Pensez à prendre un SGBD qui supporte correctement la norme SQL et si
vous voulez quelque chose de réellement Free, PostGreSQL le fait très bien.

A +


Merci




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
1 2