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

SQL Oracle Discussion :

Enigme SQL autour de la fonction length


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur Logistique
    Inscrit en
    Octobre 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Logistique
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 104
    Points : 97
    Points
    97
    Par défaut Enigme SQL autour de la fonction length
    Bonjour à tous,

    En parcourant le code d'une de mes applications, je suis tombé sur celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (LENGTH(REJECTED_LINE) - LENGTH(REPLACE(REJECTED_LINE,';',NULL))) / NVL(LENGTH(';'),1) )
    Ce code sert au départ à vérifier le nombre de colonne dans une ligne extraite d'un fichier .csv, mais je cherche à comprendre l'intérêt de la partie située après la division.
    De mon analyse je déduit que :
    • NVL sert à éviter de faire une division par 0 dans le cas ou length(';') est null
    • LENGTH(';') peut donc être null ou supérieur à 1.


    L'énigme est donc :
    Dans quel cas length(';') peut être null ou supérieur à 1.

    J'émet une hypothèse autour de l'encodage, mais la fonction lengthb sert à indiquer le nombre d'octets d'un paramètre.
    Ce pourrait-il qu'une justification de ce code tienne à une ancienne version d'oracle ?

    Merci de vos éclairages.

    Philippe

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    À mon avis il y avait autre chose dans ce nvl, surement un length d'une colonne, et ça a été remplacé sans être repensé.
    Bref ne perdez pas trop de temps dessus

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Comme Waldar le suggère, c'est très certainement un bout de code qui a dû être enlevé. Pour empêcher une division par 0 on n'utilise pas NVL mais DECODE (en SQL) ou CASE (SQL et PL/SQL). De plus, dans le code:

    REPLACE(REJECTED_LINE,';',NULL)

    NULL est superflu car c'est la valeur défaut de la chaine de remplacement.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 786
    Points
    30 786
    Par défaut
    D'ailleurs ce n'est pas NULL mais '' (chaine vide) qu'il faudrait utiliser ici.
    Mais Oracle mélange les deux contrairement à d'autres SGBD qui respectent la norme.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Je pense que c'est un code générique avec un séparateur en paramètre, qui a été remplacé sans chercher à comprendre ou à optimiser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (LENGTH(REJECTED_LINE) - LENGTH(REPLACE(REJECTED_LINE, var_sep))) / NVL(LENGTH(var_sep),1) )
    Admettons que le séparateur de colonne soit ";" (3 caractères), alors oui il faut bien diviser par 3 pour avoir le nombre de séparateurs dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (LENGTH(REJECTED_LINE) - LENGTH(REPLACE(REJECTED_LINE,'";"'))) / NVL(LENGTH('";"'),1) )
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. [PL/SQL - PAIR/IMPAIR] Recherche fonction
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 06/02/2006, 14h47
  2. [SQL] Comment réaliser une fonction d'incrementation ?
    Par da_latifa dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/12/2005, 11h14
  3. PL/SQL retour d'une fonction
    Par aaronw dans le forum PL/SQL
    Réponses: 2
    Dernier message: 13/12/2005, 13h25
  4. [T-SQL] COmment simuler la fonction isnumeric ?
    Par SegmentationFault dans le forum Adaptive Server Enterprise
    Réponses: 4
    Dernier message: 02/11/2005, 16h57
  5. [T-SQL] Creation d'une fonction (syntaxe)
    Par MaxiMax dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 18/08/2005, 15h27

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