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

Langage SQL Discussion :

Comparer chaine caractère


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 122
    Points : 54
    Points
    54
    Par défaut Comparer chaine caractère
    Bonjour,

    J'ai deux chaines de caractères de 16 caractères soit v_chaine1 et v_chaine2.
    Je dois comparer chaque caractère un après l'autre dans les deux chaines et si au premier caractère rencontré dans la chaine 1 qui ne correspond pas au meme endroit dans la chaine 2, je dois retourner 'False'.

    Comment je dois procéder?

    Merci beaucoup!

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 : 21 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN Col1 <> Col2 THEN FALSE ELSE TRUE END
    Plus simple encore sur certaine SGBD :
    A +

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 122
    Points : 54
    Points
    54
    Par défaut
    J'avais oublié...

    Dans une des chaine de caractères, il peux y a avoir un ou plusieurs caractère '*' alors c'est ok on peux continuer la comparaison. c'est si on retrouve un autre caractère que ça doit bloquer.

    Un peux pour ça qu'on doit comparer caractere par caractère.

    Merci!

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Si vous remplacez votre * par un _ vous devriez pouvoir utiliser un LIKE.

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 122
    Points : 54
    Points
    54
    Par défaut
    J'avais au départ une chaine de caractère qui avait des espaces entre les caractères dans une chaine.

    J'ai fait une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    REPLACE(Chaine1,' ','*');
    ' ' est un espace remplacé par '*'

    Bien d'accord pour le 'LIKE' mais je dois ajouter une problématique.
    chaine1 = ('ABCDEFGHIJ');
    chaine2 = ('A*C4EF*HIJ');

    Si je rencontre une '*' alors c'est OK mais si je rencontre un autre symbole comme par exemple le '4' qui n'est pas pereil au 'D' mais qui n'est pas une '*' c'est là que je dois retourner une erreur.

    Y a t'il une facon plus performante que celle que je fait plus bas pour comparer les caractères?

    Je me demandais si je dois faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    chaine1_car1 := substr(chaine1,1,1);
    chaine1_car2 := substr(chaine1,2,1);
    chaine1_car3 := substr(chaine2,3,1);
    chaine1_car4 := substr(chaine2,4,1);
    chaine2_car1 := substr(chaine2,1,1);
    chaine2_car2 := substr(chaine2,2,1);
    chaine2_car3 := substr(chaine2,3,1);
    chaine2_car4 := substr(chaine2,4,1);
    etc...
     
    IF chaine1_car2 <> chaine2_car2 then
       IF chaine2_car2 = '*' then
          v_reponse := 'TRUE';
      else
         if chaine2_car4 <> '*'  and chaine2_car1 <> chaine1_car1 then
            v_reponse := 'False';
        end if;
    End if;
    Merci!

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 : 21 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE '123456' LIKE REPLACE(Chaine1,' ','_');
    Tout simplement, car _ est un joker. A lire : http://sqlpro.developpez.com/cours/sqlaz/select/#L3.4

    A +

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Citation Envoyé par Marcel Chabot Voir le message
    Si je rencontre une '*' alors c'est OK mais si je rencontre un autre symbole comme par exemple le '4' qui n'est pas pereil au 'D' mais qui n'est pas une '*' c'est là que je dois retourner une erreur.
    Ça ne change rien, sauf si vous devez connaître les positions des caractères différents.

    Voici un exemple avec Oracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    with mot as
    (
    select 'ABCDEFGHIJ' as m1 from dual
    )
      ,  masque as
    (
    select 1 as nm, 'A C4EF HIJ' as m2 from dual union all
    select 2      , 'A CDEF HIJ'       from dual union all
    select 3      , 'BCDEFGHIJA'       from dual union all
    select 4      , 'ABCDEFGHIJ'       from dual union all
    select 5      , '          '       from dual
    )
    select ms.nm, mt.m1, ms.m2,
           case when mt.m1 like replace(ms.m2, ' ', '_') then 1 else 0 end as reponse
      from mot mt
           cross join masque ms
     order by ms.nm asc;
     
    NM	M1		M2		REPONSE
    1	ABCDEFGHIJ	A C4EF HIJ	0
    2	ABCDEFGHIJ	A CDEF HIJ	1
    3	ABCDEFGHIJ	BCDEFGHIJA	0
    4	ABCDEFGHIJ	ABCDEFGHIJ	1
    5	ABCDEFGHIJ	          	1

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 122
    Points : 54
    Points
    54
    Par défaut
    Merci beaucoup ça m'a éclairé!!!

    Voilà ce que j'ai fait!

    Je sort quand je rencontre le chiffre 6 dans v_no_compte_modif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    CREATE OR REPLACE PROCEDURE ACCES_ENGAG   IS
     
    v_no_compte_param VARCHAR2(16);
    v_no_compte_modif VARCHAR2(16);
    v_compteur NUMBER;
    v_sortie varchar2(3);
     
    begin
     
    v_no_compte_param := ('ABCDEFGHIJKLMNOP');
    v_no_compte_modif := ('AB D FGH6JKLMNO3');
     
    v_no_compte_modif := REPLACE(v_no_compte_modif,' ','*');
     
     
    v_compteur := 0;
    v_sortie := 'NON'; 
     
     
    WHILE v_sortie = 'NON' and v_compteur < 17
     
    LOOP
     
       IF SUBSTR(v_no_compte_param,v_compteur,1) <> SUBSTR(v_no_compte_modif,v_compteur,1) and SUBSTR(v_no_compte_modif,v_compteur,1) <> '*' THEN
     
          v_sortie := 'OUI';
     
       end if;
           v_compteur := v_compteur+1;
     
    end loop;
     
    END ACCES_ENGAG;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Trigger] comparer chaine de caractères
    Par tck-lt dans le forum PL/SQL
    Réponses: 2
    Dernier message: 06/12/2011, 12h03
  2. [SAX] Récupération chaine caractère
    Par sebus dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 26/02/2006, 23h57
  3. Réponses: 2
    Dernier message: 06/11/2005, 11h11
  4. [FPDF] Recherche chaine caractères dans fichier pdf
    Par licorne dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/10/2005, 11h55
  5. []recherche chaine caractère partielle
    Par cd090580 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/09/2005, 14h15

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