IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Concaténation de colonnes


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Par défaut Concaténation de colonnes
    Bonjour,

    Voici mes tables : (je suis en SQL server 2008)

    USER (id, nom, prenom, login, date_naissance)
    LANGUES (id, nom)
    USER_LANGUES (id_user, id_langue, niveau)

    Je voudrais mettre un champ dans la table user qui s'apellera "concatenation", et qui contiendra pour un user donné, la concaténation des champs.

    Exemple : User = Jean Dupont
    champ "concatenation" de la table user contient "dupont jean jeannot 30/06/1980 francais bon anglais moyen espagnol excellent".

    Donc une concaténation de ses infos user et de ses langues parlées & niveaux.

    Je ne vois pas comment faire cela

    Merci

    Dev

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Alors avant même de se demander comment, il faudrait surtout se demander pourquoi vous voulez transformer des données utiles et exploitables en un magma inutilisable ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Par défaut
    Pourquoi pas?
    J'en ai besoin, ce ne sera pas inutilisable pour moi.

  4. #4
    Membre expérimenté
    Inscrit en
    Janvier 2012
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 145
    Par défaut
    Si vous y tenez vraiment, vous pouvez regarder ce post.

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par Devlin111 Voir le message
    Pourquoi pas?
    J'en ai besoin, ce ne sera pas inutilisable pour moi.
    J'imagine que vous n'en n'avez pas besoin de façon permanente, en base.
    Il doit s'agir d'un besoin ponctuel : export, écran.
    Dans ce cas, le mieux serait de faire ceci du côté applicatif plutôt qu'en base. Au pire, une vue fera l'affaire ; sincèrement, quel est l'intérêt de stocker en base quelque chose qui se retrouve aussi facilement ? Ça va consommer de l'espace, ça pourra être en décalage avec les données (à moins de mettre des vilains triggers de partout qui iront mettre jour ladite colonne), ...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Par défaut
    Je vous remercie pour vos réponses.
    Mais ce n'est pas tout à fait ça que je voudrais faire : en effet, je veux mettre dans la table user, les infos de toutes les autres tables de ma base liées à un user ....
    Comment adapter ce code?

    Non, cela ne se retrouve pas facilement. Pour chacun des user, je dois stocker toutes les informations qui lui correspondent. Je dois le faire dans une procédure stockée, je m'en servirais très souvent

  7. #7
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Non, cela ne se retrouve pas facilement. Pour chacun des user, je dois stocker toutes les informations qui lui correspondent. Je dois le faire dans une procédure stockée, je m'en servirais très souvent
    Ridicule, repassez sur EXCEL...

    Un modèle de données n'est pas juste la pour vous embeter, un langage existe pour retrouver les données de votre User à la demande: SQL (avec des SELECT des jointures vous voyez).

  8. #8
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Tout à fait d'accord ... autant avoir une table avec une colonne et toutes vos informations dans ce cas ... mais comme vous vous en doutez c'est la plus mauvaise chose à faire ...

    Expliquez nous votre besoin final que nous puissions vous aider correctement.

    ++

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    He ben si on commence à avoir dans se forum des gens qui viennent avec toutes les mauvaises et stupides pratique acquise avec MySQL, on va rigoler !

    En tout cas c'est bon pour le portefeuille ce genre d'imbécilité, car cela va générer à terme beaucoup d'audit de performances... donc du chiffre d'affaire pour le consultant que je suis !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Par défaut
    SQLpro, pas la peine d'être aussi agressif, je débute en SQL Server, et en programmation en général, en quoi cela gêne? Tout le monde doit démarrer un jour ou l'autre .....

    mikedavem, mon besoin final est pour un moteur de recherche.
    Je fais un moteur de recherche, dans lequel tout ce que l'on recherchera se rapportera forcément à un USER.

    Je comptais donc prendre toutes les informations utiles de toutes les tables liées à un user, les mettre dans un champ de la table user qui serait une concaténation de toutes les valeurs possiblement dans la recherche.

    Ensuite, lors d'une recherche d'un utilisateur, il m'aurait suffit de voir le nombre de mots dans la textbox de recherche, et de rechercher ce/ces mot(s) dans mon champ de concaténation et renvoyer les infos de/des user(s) ainsi récupérés .....

    J'ai toujours fais ainsi, mais je débute, je n'ai fais que de petits moteurs de recherche, à la fac uniquement, et c'était en MySql.

    Si tu as mieux à me proposer, je t'écoutes, et je te remercie ...

    Dev

  11. #11
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Ok je comprends votre besoin.

    Avec SQL Server vous pouvez par exemple utiliser le moteur de recherche Full Text pour ce que vous voulez faire.

    ++

  12. #12
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Pourquoi faire de la recherche en full text sur une concaténation discutable quand on peut aller chercher ce qu'on veut dans les colonnes ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id, nom, prenom
      FROM USER
     WHERE concatenation LIKE '%francais bon%'
    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT u.id, u.nom, u.prenom
      FROM USER u
              INNER JOIN USER_LANGUES ul ON (u.id = id_user)
     WHERE id_langue = 'idFrancais' -- obtenu dans l'appli, sinon faire une jointure
         AND niveau = 'bon'

  13. #13
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Pourquoi faire de la recherche en full text sur une concaténation discutable quand on peut aller chercher ce qu'on veut dans les colonnes ??
    Le but bien entendu est de faire de la recherche full text sur un ensemble de colonnes et non une colonne concaténée.

    En général la recherche fulltext est bien adaptée pour les moteurs de recherche où des critères de recherche sont beaucoup plus complexes que des précidats classiques tels que WHERE col = valeur etc ....

    ++

  14. #14
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Rechercher sur une concaténation de colonne n'a que peu de sens... comment savez vous à partir de quelle information vous avez trouvé le résultat?

    Vous pouvez surement faire mieu par exemple:
    Creer une table du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE dbo.USER_INFOS
    (
    USER_ID INTEGER
    INFO_SOURCE VARCHAR(20) (ajouter un FK vers une autre table listant les type de source par exemple)
    INFO_VALUE VARCHAR(2000) -> avec FULLTEXT 
    )
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM dbo.USER_INFOS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1 'NOM' 'IGNACE'
    1 'PRENOM' 'BRUNO'
    1 'AGE' 18
    1 'LIEU_NAISSANCE' NOUMEA
    1 'DEVISE' 'Le Bordeaux ya que ca de vrai!'
    VOus pouvez ainsi faire des recherches fines en pondérant les type de source ou en ne cherchant que sur certains d'entre eux..


    Celà n'est qu'une ebauche pour vous aiguiller..

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Par défaut
    Je vous remercie tous pour vos piste Je vais voir ce que je peux faire.

    iberserk, pour t'expliquer comment j'avais réfléchi :

    En fait le moteur de recherche n'est fait que pour rechercher une personne (un user), donc une fois toutes les informations importantes concaténées dans mon champ dans la table user, je n'avais plus qu'à le parcourir.

    Ex : on recherche quelqu'un qui est bon en anglais (donc par exemple "anglais bon niveau"): il me suffit de parcourir ma table user et de vérifier dans mon champ de concaténation si je trouve "anglais" et "bon", si oui, je renvoie cet user (ou ces user).
    Si on recherche quelqu'un qui a un bac +3 en informatique ("licence informatique"), je n'ai pareil plus qu'à rechercher les termes dans ma colonne de concaténation ...

    Enfin c'est comme ça que j'imaginais, mais apparemment ce n'est pas une bonne idée, je vais donc voir avec les vôtres.

  16. #16
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il y a un bug dans votre code, ici :

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Par défaut
    Bon ... finalement, je ne peux pas utiliser FULL TEXT.

    Abandonner ma solution de concaténation me laisse un peu perplexe ... disons que je ne vois plus trop comment procéder du coup.

    Mon interface de recherche se compose pour l'utilisateur qui voudra faire sa recherche de deux textbox (une pour dire ce qu'il veut (ex: un bac+3 informatique), l'autre pour dire où il le veut (ex : Aquitaine, IDF ...).
    Il y a aussi deux boutons radios et une combobox pour affiner un peu la recherche.

    Donc, du coup, une fois que j'ai récupéré les valeurs entrées par l'utilisateur dans les textbox, et que j'ai découpé ça en mots, je ne sais plus trop comment faire. Avec ma précédente idée, il me suffisait de chercher dans mon champ concaténation mes mots, et ensuite de filtrer les résultat selon si bouton radio coché ou non, si quelque chose de sélectionné dans la combobox.

    Maintenant, je dois faire quoi en gros, si j'abandonne cette idée? Je dois rechercher les mots un par un dans toutes les tables de ma DB?

    Je ne dois faire aucune requête dans mon code, tout doit se faire par procédures stockées.

    Merci ...

    Dev

  18. #18
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 81
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Au pire, une vue fera l'affaire ; ...
    Je me permets de reprendre ce que disait Rei:
    Vous indiquez ne pas pouvoir utiliser la recherche Full Text, ne pas pouvoir utiliser de T-sql dans votre code mais seulement des procédures stockées.

    Dans ce cas, je dirais qu'il ne vous reste effectivement plus que la solution d'une SP basée sur une vue.
    Vous pourrez construire celle-ci avec des jointures soigneusement choisies et jouer avec les clauses "where","like" etc... et passer les valeurs de vos Textbox en paramètres de la SP

    En termes de performances ce n'est certes pas ce qui se fait de mieux, mais si vos impératifs vont dans ce sens.... Il faudra toutefois prévenir votre responsable que les performances peuvent être catastrophiques ( et cela pourrait même interférer sur les perfs globales de votre serveur si je ne dis pas de bêtises ).

    Bonne journée

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Par défaut
    Swiss_GaGGy tu dis que :

    En termes de performances ce n'est certes pas ce qui se fait de mieux, mais si vos impératifs vont dans ce sens.... Il faudra toutefois prévenir votre responsable que les performances peuvent être catastrophiques ( et cela pourrait même interférer sur les perfs globales de votre serveur si je ne dis pas de bêtises ).
    Quel est d'après toi ce qui se fait de mieux en terme de performances? J'ai des impératifs, mais je peux toujours les discuter

  20. #20
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 81
    Par défaut
    Bonjour,

    Je dirais que ce qui resterait le plus performant a déjà été mentionné plus haut et je rejoint les propositions de Mikedavem notamment.
    Le mieux, pour vos besoins, serait effectivement la recherche Full-Text ( C'est du moins ce que j'aurais mis en place pour un "moteur de recherche"

    Mais dans la mesure où vous ne pouvez l'utiliser, il ne vous reste, à mon humble avis, plus qu'à vous orienter vers des vues dans une procédure stockée

    Bonne journée

Discussions similaires

  1. concaténer deux colonnes avec séparateur ', '
    Par briceg dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 23/10/2009, 11h33
  2. Concaténer 2 colonnes de 2 tables différentes ?…
    Par Mister Paul dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/10/2008, 11h19
  3. [MySQL] Concaténer plusieurs colonnes d'une table temporaire
    Par kryogen dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 27/08/2008, 10h56
  4. Concaténer une colonne
    Par aigleborgne dans le forum Développement
    Réponses: 3
    Dernier message: 07/05/2008, 15h02
  5. Réponses: 10
    Dernier message: 29/08/2006, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo