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 :

Avis sur ma requête pour classer une liste en fonction d'une présence de substring


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 467
    Par défaut Avis sur ma requête pour classer une liste en fonction d'une présence de substring
    bonjour,
    j'ai une liste comme ça :

    1 paul
    2 ancien salarié : jacque
    3 alain
    4 ancien salarié : andré
    Quand un salarié n'est plus là, il y a le nom qui comporte "ancien salarié:" dans la chaine.

    je souhaite avoir une liste des salariés dans l'ordre AZ puis les anciens salariés :
    Alain
    paul
    ancien salarié : andré
    ancien salarié : jacque
    Comme mysql n'a pas de fonction pour compter/tester la présence d'une occurrence substring, j'ai fait cette requête .
    Le résultat est fiable mais y-a-t-il un bug ou une exception que j'aurai pu oublier :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom
    FROM personnes
    ORDER BY (nom NOT LIKE '%ancien') DESC, nom ASC ;

    qu'en pensez-vous ?
    fiable ou possiblement buggée ?

  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 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom
    FROM   personnes
    ORDER BY CASE WHEN nom LIKE 'ancien salarié :%' THEN 2 ELSE 1 END, nom;
    Et pour maîtriser le langage SQL : https://sqlpro.developpez.com/

    Modifié avec le joker % du LIKE..... Mille excuses, je donnais un cours d'optimisation....

    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/ * * * * *

  3. #3
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 325
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 325
    Billets dans le blog
    17
    Par défaut
    Comme mysql n'a pas de fonction pour compter/tester la présence d'une occurrence substring
    Pour tester : POSITION() => https://dev.mysql.com/doc/refman/8.0...ction_position

    Pour compter le nombre d'occurrences d'une sous-chaîne tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set @haystack = 'foo bar foo foo';
    set @needle = 'foo';
    select all (char_length(@haystack) - char_length(replace(@haystack, @needle, ''))) / char_length(@needle) as substr_count; -- 3

    J'ajoute le % oublié par SQLPro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom
    FROM personnes
    ORDER BY CASE WHEN nom LIKE 'ancien salarié : %' THEN 2 ELSE 1 END ASC, nom ASC;

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 602
    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 602
    Billets dans le blog
    10
    Par défaut
    il existe également la fonction LOCATE() pour localiser la position d'une chaîne de caractères, mais la solution la plus simple est celle proposée par SQLpro, complétée du wildcard % comme précisé par Séb.

  5. #5
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 467
    Par défaut
    bonjour,


    en quoi la close suivante (suggérée par SQLpro) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY CASE WHEN nom LIKE 'ancien %' THEN 2 ELSE 1 END ASC, nom ASC;

    est meilleure que celle ci (la mienne)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY (nom NOT LIKE 'ancien%') DESC, nom ASC ;

    est-ce que l'utilisation d'un integer (solution de SQLpro) consomme moins de perf/ressource que l'utilisation du boolean (la mienne) ?
    est-ce que l'utilisation d'un CASE (solution SQLpro) est plus rapide que l'utilisation basique d'une expression implicite (la mienne) ?

    Je me mets à la place du compilateur, si je vois un CASE OF, je dois vérifier plus de chose dans la syntaxe, donc plus de temps ..
    Et en mémoire, un integer prend plus de ressource qu'un boolean, non ?

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 602
    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 602
    Billets dans le blog
    10
    Par défaut
    not like %ancien filtre les noms ne se terminant pas par 'ancien', ce qui ne correspond à aucune ligne de votre jeu d'essai
    De plus, cet argument n'est pas "SArgAble" : aucun index n'est éligible s'il en existe sur la colonne "NOM"
    il faut remplacer cette instruction par not like ancien% qui sera éventuellement "SArgAble".

Discussions similaires

  1. Vos avis sur les technologies pour une application pour AppleStore ou GoogleStore svp ?
    Par souviron34 dans le forum Débats sur le développement - Le Best Of
    Réponses: 4
    Dernier message: 12/12/2022, 18h47
  2. Avis sur mon CV pour une Alternance
    Par Hikimichi dans le forum CV
    Réponses: 19
    Dernier message: 02/08/2016, 09h39
  3. Avis sur 2 solutions pour récupérer une liste de valeurs
    Par bernidupont dans le forum Oracle
    Réponses: 4
    Dernier message: 31/01/2015, 17h57
  4. Réponses: 6
    Dernier message: 31/08/2007, 08h20
  5. [VB.NET] Clic sur un bouton pour afficher une form existante
    Par beegees dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/06/2006, 10h31

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