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

Requêtes MySQL Discussion :

Requete SQL avec Like ou autre


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2016
    Messages : 5
    Par défaut Requete SQL avec Like ou autre
    Bonjour à tous,

    Voilà je ne sais pas si je suis sur le bon forum, je m'en excuse si ça n'est pas le cas.

    Mon problème est que je n'arrive pas à récupérer une chaine entre deux caractères "-".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(MVCTNUMLOT) FROM MVTSTO WHERE MVCTNUMLOT like'%-"+LOT+"-%' AND  MVITSOC='"+wp_soc+"'
    Le LOT est ainsi : 1986532-99-000 et peut être aussi sous cette forme 12569-100-001...

    Je souhaite récupérer le max de mon LOT compris entre ces deux caractères "-".

    Pouvez-vous m'aider? s'il vous plait

    Merci

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 544
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Pour faire ce genre de requête il faut faire du SQL dynamique, cherchez ces mots clefs dans le forum, vous trouverez de l'aide.

    Attention toutefois : si votre table est volumineuse, une recherche like commençant par % va prendre un temps de recherche très conséquent, à éviter sur de grosses tables

    Attention aussi :
    - le SQL dynamique est propice aux injections SQL (failles de sécurité)
    - le SQL dynamique plombe parfois les performances
    - le SQL dynamique rend les études d'impact difficiles

    Du coup, le SQL dynamique est souvent interdit sur les sites de production, à vérifier avant de vous engager dans cette voie

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Pourquoi du sql dynamique ?

    J'ai plutôt l'impression que c'est une combinaison de substr instr qu'il lui faut :
    Mysql String Functions

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 544
    Billets dans le blog
    10
    Par défaut
    Il y a combinaison de constantes et de variables et la longueur et la structure du n° de lot n'est pas fixe ==> SQL dynamique pour construire le WHERE

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2016
    Messages : 5
    Par défaut Requête Like et autres
    Bonjour à tous,

    Merci de vos réponses, je vais faire des tests,

    En effet le LOT se compose du numéro de lot non fixe + numéro de palette de 001 a 100 n+ + un numéro fixe a 001/000.

    ainsi dans ma table avec la requête je dois retourner le max du numéro de palette qui est encadré via les "-".

    Merci

  6. #6
    Membre chevronné Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Par défaut
    Le LOT est ainsi : 1986532-99-000 et peut être aussi sous cette forme 12569-100-001...
    si je comprends bien le max de ces deux lots c'est 100 ?

    si c'est bien le cas, cette requête pourrait vous aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MAX(SUBSTRING_INDEX(SUBSTRING_INDEX('oeirh-toto-qslkbj', '-', 2), '-', -1))
    FROM MVTSTO
    WHERE MVCTNUMLOT like'%-"+LOT+"-%' 
          AND MVITSOC='"+wp_soc+"'
    cela dit, le résultat sera toujours égal à votre variable "LOT" vu que vous le préciser dans votre WHERE : MVCTNUMLOT like'%-"+LOT+"-%'

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2016
    Messages : 5
    Par défaut Requete avec LIKE
    Citation Envoyé par Sebwar Voir le message
    si je comprends bien le max de ces deux lots c'est 100 ?

    si c'est bien le cas, cette requête pourrait vous aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MAX(SUBSTRING_INDEX(SUBSTRING_INDEX('oeirh-toto-qslkbj', '-', 2), '-', -1))
    FROM MVTSTO
    WHERE MVCTNUMLOT like'%-"+LOT+"-%' 
          AND MVITSOC='"+wp_soc+"'
    cela dit, le résultat sera toujours égal à votre variable "LOT" vu que vous le préciser dans votre WHERE : MVCTNUMLOT like'%-"+LOT+"-%'
    Merci sebwar.

    Je n'avais pas précisé pour le cas je suis sous windev, donc substring_index, non reconnu, mais je vais travaillé sur ta réponse.

    Si je comprends bien tu soustrait les deux "-"? tu peux m'expliquer le SUBSTRING_INDEX(SUBSTRING_INDEX('oeirh-toto-qslkbj', '-', 2), '-', -1)) s'il te plait?

    tu soustrait les 2 - dans mais le -1?

    Merci

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2016
    Messages : 5
    Par défaut Requete Like ou autres
    Je viens de tester ça

    LOT= pg_requete("SELECT Max(SUBSTRING(MVCTNUMLOT, '-',3))FROM MVTSTO WHERE MVCTNUMLOT='"+LOT+"' AND MVITSOC='"+wp_soc+"'")

    J'ai apporté des modification, j'ai comme num palette que sur 3 chiffres maintenant.
    099, 100, 101...

    Comme ça je réduit le problème.

    Erreur, le type de données de l'argument varchar n'est pas valide pour l'argument 2 de la fonction substring...

    Quelqu'un a une idée?

  9. #9
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 778
    Par défaut
    Salut à tous.

    Au départ, j'ai cru comprendre que la solution se trouvait dans les expressions régulières de MySql.
    Puisque comme sebwar, j'avais compris qu'il devait sélectionner le lot qui est compris entre deux '-'. D'où :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where val regexp '^[[:digit:]]+[[.hyphen.]]{1}100[[.hyphen.]]{1}[[:digit:]]+$';
    Mais après relecture de la question posé, en effet, il s'agit de récupérer la valeur maximal du lot qui se trouve entre deux tirets.
    Voici le test que j'ai repris de l'exemple de sebwar :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    set session collation_connection = "latin1_general_ci"
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test` (
      `id`          int       NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `val`      varchar(255)     NULL DEFAULT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`val`) values
      ('1986532-99-000'),
      ('1788432-100-000'),
      ('2516552-98-000'),
      ('1986532-150-000')
    --------------
     
    --------------
    select concat('-->',val, '<--') as val from test
    --------------
     
    +-----------------------+
    | val                   |
    +-----------------------+
    | -->1986532-99-000<--  |
    | -->1788432-100-000<-- |
    | -->2516552-98-000<--  |
    | -->1986532-150-000<-- |
    +-----------------------+
    --------------
    select concat('-->',val, '<--') as val from test where val regexp '^[[:digit:]]+[[.hyphen.]]{1}100[[.hyphen.]]{1}[[:digit:]]+$'
    --------------
     
    +-----------------------+
    | val                   |
    +-----------------------+
    | -->1788432-100-000<-- |
    +-----------------------+
    --------------
    SELECT MAX(cast(SUBSTRING_INDEX(SUBSTRING_INDEX(val, '-', 2), '-', -1) as unsigned integer)) as 'lot' from test
    --------------
     
    +------+
    | lot  |
    +------+
    |  150 |
    +------+
    --------------
    SELECT MAX(cast(SUBSTRING_INDEX(SUBSTRING_INDEX(val, '-', 2), '-', -1) as unsigned integer)) as 'lot' from test
    --------------
     
    +------+
    | lot  |
    +------+
    |  150 |
    +------+
    --------------
    SELECT max(cast(substring(val,locate('-', val) + 1,locate('-', val,(locate('-', val) + 1)) - locate('-', val) - 1) as unsigned integer)) as 'lot' from test
    --------------
     
    +------+
    | lot  |
    +------+
    |  150 |
    +------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Dans cet exemple, j'ai repris les points suivants :
    1) sélection des lignes ayant tel numéro de lot à partir d'un regexp de MySql.

    2) la solution de Sebwar mais avec un max(cast( chaine as unsigned integer)) as 'lot'.

    3) une autre solution basée que sur le substring.

    Citation Envoyé par Escartefigue
    Pour faire ce genre de requête il faut faire du SQL dynamique
    Il s'agit d'extraire une sous-chaîne délimitée entre deux tirets. En quoi le SQL dynamique pourrait nous aider ?
    Dans le jargon de MySql, on nomme cela une requête préparée : http://dev.mysql.com/doc/refman/5.7/...tatements.html

    Citation Envoyé par Ghost_Dog
    Je n'avais pas précisé pour le cas je suis sous windev, donc substring_index, non reconnu, mais je vais travaillé sur ta réponse.
    Substring_index() est une fonction de MySql et non de windev. De quelle version MySql utilises-tu ?

    Citation Envoyé par Ghost_Dog
    Si je comprends bien tu soustrait les deux "-"? tu peux m'expliquer le SUBSTRING_INDEX(SUBSTRING_INDEX('oeirh-toto-qslkbj', '-', 2), '-', -1)) s'il te plait?
    Le deuxième substring_index recherche la deuxième occurrence du tiret. Il te retourne une sous-chaîne contenant la chaîne du début jusqu'au second tiret non compris.
    Le première substring_index reprend la sous-chaîne extraite et recherche la première occurrence du tiret. Il extrait tout ce qui est entre ce tiret non compris, jusqu'à la fin de la sous-chaîne.

    Donc le '+2' signifie la deuxième occurrence en allant vers la droite. Le '-1' signifie la première occurrence en allant vers la gauche.

    Citation Envoyé par Ghost_Dog
    Erreur, le type de données de l'argument varchar n'est pas valide pour l'argument 2 de la fonction substring...
    Reprends mon exemple ci-dessus. La solution est de faire un cast avant d'appliquer la fonction max().

    @+

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2016
    Messages : 5
    Par défaut Reponse SQL SERVER 2008
    Bonjour à tous,

    J'ai repris ta solution, qui je dois dire est géniale. Je te remercie d'avoir pris le temps de m'expliquer bien en détail le substring, ainsi que toutes les réponses des autres membres.

    Je suis sur Sql server 2008, et windev 17 sur un ERP CEGID-PMI.

    Il n'accepte pas la syntaxe Substring_index. Je lui ai donc passé un substring et la il me dit " syntaxe incorrecte vers 'integer'.
    SQLCODE=102) Microsoft SQL server Native Client 10.0.

    Je continue mes tests, merci grace a ta réponse je progresse en sql pur.

    Merci
    Images attachées Images attachées  

  11. #11
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 778
    Par défaut
    Salut Ghost_Dog.

    Citation Envoyé par Ghost_Dog
    Je suis sur Sql server 2008, et windev 17 sur un ERP CEGID-PMI.
    C'est la peur de SQLPRO qui fait que tu as posé ta question dans le forum MySql ?

    La prochaine fois, n'oublie pas de nous parler de tes contraintes !

    @+

Discussions similaires

  1. [MySQL] requete sql avec like en utilisant une variable
    Par amesnaou dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 27/05/2009, 10h22
  2. AIDE SUR REQUETE SQL AVEC FONCTION LIKE
    Par everblue dans le forum Langage SQL
    Réponses: 0
    Dernier message: 16/03/2008, 18h56
  3. requete sql avec le like
    Par gentil dans le forum JDBC
    Réponses: 2
    Dernier message: 04/01/2007, 12h00
  4. requete sql avec like ?
    Par Melvine dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/11/2006, 15h49
  5. Attribuer une requete sql avec 'like' en source de formulaire
    Par en_gel_ho dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 04/10/2006, 13h41

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