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

Développement SQL Server Discussion :

Insérer une variable dans un LIKE


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Points : 19
    Points
    19
    Par défaut Insérer une variable dans un LIKE
    Bonjour à tous,

    j'aimerais voir si une variable nom contient une chaine de caractères qui est variable aussi. ma requête ne me donne aucun résultat. pourriez-vous m'aider?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE table1
    SET ID1 = (SELECT max(f.ID2) FROM table2 AS f 
    WHERE table1.nom LIKE '%' + f.nom + '%'
    )
    merci

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Quel est votre SGBD ?

    ça sent le SQL Server, si c'est le cas, votre requête semble syntaxiquement correcte.
    Quand vous dites aucun résultat... est-ce qu'aucune ligne n'est mise à jour ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    Effectivement il s'agit de sql server. Aucune ligne n'est mise à jour à partir de ma requête.
    Le but de ma requête est que dans ma table client j'ai un ID et un nom. exemple : ID = 100 et Nom = 'Blaise Badouda'. Lorsque le client remplit un formulaire et donne un Nom = 'Badouda', j'aimerai récupérer l'ID égal à 100 pour dire qu'il s'agit d'une meme personne.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Comme je le disais, votre syntaxe est correcte.
    Le fait qu'aucune ligne n'est mis à jour vient donc a priori des données.

    La première chose à laquelle je pense est la sensibilité à la casse à vérifier.

    Idéalement, fournissez les CREATE TABLE et un jeu d'essai sous forme de INSERT INTO(j'ai supposé que dans votre exemple, table1 contient 'blaise badouda' et table2 contient 'badouda' !?!)

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    Lorsque j'exécute la requête sans LIKE, les IDs sont mis à jour (si les noms correspondent bien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE table1
    SET ID1 = (SELECT max(f.ID2) FROM table2 AS f 
    WHERE table1.nom = f.nom 
    )
    donc je ne pense pas que ça soit dû à la casse ou je me trompe?

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    étrange ! à moins qu'il n'y ait une espace qui traine à la fin de vos noms dans la table2

    Que vous renvoie cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM table2
    WHERE nom LIKE '% '

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    Avant d'insérer le nom dans la table, j'ai déjà exécuté un ltrim et un rtrim

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    quel est le type des données ?

    (je mets une option sur du CHAR ou du NCHAR avec des longueurs différentes )

    Comme déjà dit, fournissez la structure complète des tables. On gagnera tous du temps !

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    ci-après la structure des 2 tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE [dbo].[table1](
    	[ID1] [bigint] NULL,
    	[NOM] [nchar](50) NULL,
    	[PRENOM] [nchar](100) NULL
    )
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE [dbo].[table2](
    	[ID2] [bigint] IDENTITY(20888,1) NOT NULL,
    	[NOM] [varchar](64) NULL,
    	[PRENOM] [varchar](100) NULL
    ) ON [PRIMARY]
    le problème se situerait sur le type de mes champs ?

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    oui... et non !

    Idéalement, il faudrait harmoniser les types des colonnes.

    Si vous ne pouvez pas, il faudra transtyper dans votre requête en ajoutant éventuellement un RTRIM

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE table1
    SET ID1 = (SELECT max(f.ID2) FROM table2 AS f 
    WHERE RTRIM(CAST(table1.nom AS VARCHAR(68))) LIKE '%' + f.nom + '%'
    )
    Cependant, j'aurai compris le comportement que vous décrivez si le NCHAR avait été dans la table2, et le VARCHAR dans la table1. Là... ça ne devrait pas poser de souci tel que vous faites la requête...

    EDIT : avez vous exécuté ma requête en post #6 ?

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    j'ai exécuté la requête de votre post #6 et effectivement ça me renvoie des valeurs. je vais nettoyer avec un rtrim. merci pour l'astuce.

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    mais mon principal problème n'est toujours pas résolu...moi aussi je sens ma requête syntaxiquement correcte. mais le résultat attendu n'est toujours pas là

  13. #13
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    toujours le même comportement après avoir retiré les espaces qui trainent en fin de chaine dans la table2 ?

    Avez-vous relancé la requête su post #6 pour vérifier que les espaces avaient bien été supprimées ?

    Si c'est le cas, postez un jeu d'essai complet, avec CREATE TABLE + INSERT INTO reproduisant le problème.

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    bonjour,

    les espaces sont toutes supprimées dans les tables.

    Je commence un peu à comprendre pourquoi ma requête ne fonctionne pas, c'est dans la syntaxe. j'aurai besoin de votre confirmation.

    Comment pourrai-je adapter ma requête avec ce qui a été expliqué dans ce post :
    http://www.developpez.net/forums/d52...like-variable/

    merci de votre aide

  15. #15
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Pouvez-vous essayer à tout hasard (1) la requête UPDATE ci-dessous :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE  A 
       SET A.ID1 = (SELECT max(f.ID2) 
                    FROM table2 AS f 
                    WHERE LTRIM(RTRIM(A.nom)) LIKE '%' + LTRIM(RTRIM(f.nom)) + '%'
                   )
    FROM Table1 AS A

    Remarque :
    - LTRIM et RTRIM retourne une valeur de type varchar ou nvarchar ; le CAST n'est pas nécessaire puisqu'il y a un transtypage implicite.

    Autres remarques :
    - (1) J’ai volontairement utilisé l’expression "à tout hasard’’. En effet, même si la requête "marche" à vos yeux, personnellement je trouve votre requête initiale, avec des LIKE, hasardeuse ! En effet, vous pouvez avoir des homonymes ou des inclusions dans les noms de famille etc.
    Exemple :
    Jean-Jacques Rousseau (grand écrivain et philosophe du 18ème siècle)
    Stéphane Rousseau (humoriste et acteur québécois contemporain)
    - Soit la colonne "nom" représente une clé candidate, et dans ce cas il est nullement besoin du LIKE,
    - Soit la colonne "nom" n’est pas une clé candidate, et dans le ce cas la requête UPDATE est vraiment hasardeuse. Il serait, dans ce cas, plus judicieux de rediriger les UPDATE vers une table temporaire et statuer manuellement au cas par cas sur les lignes à mettre à jour.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  16. #16
    Membre éprouvé
    Avatar de landry161
    Homme Profil pro
    C#,PHP,MySQL,Android...
    Inscrit en
    Juillet 2010
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : C#,PHP,MySQL,Android...

    Informations forums :
    Inscription : Juillet 2010
    Messages : 423
    Points : 1 059
    Points
    1 059
    Billets dans le blog
    1
    Par défaut
    Je comprends pas une chose il a parle de variable mais je vois pas de Déclare @nomdevariable varchar(250)

Discussions similaires

  1. [phpBB][2] Insérer une variable dans un fichier langue
    Par Sparktacus dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 27/11/2007, 05h54
  2. Insérer une variable dans une regex?
    Par Death83 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/05/2006, 12h28
  3. Ou et comment insérer une variable dans la requete?
    Par forzaxelah dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/05/2006, 12h33
  4. Probléme pour insérer une variable dans un champs
    Par BOUTRAIS dans le forum Access
    Réponses: 2
    Dernier message: 11/04/2006, 23h45
  5. Peux on insérer une variables dans une expression calculé
    Par casse.gueule dans le forum Access
    Réponses: 4
    Dernier message: 20/11/2005, 21h10

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