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 :

Recherche de l'existence d'un intervalle


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut Recherche de l'existence d'un intervalle
    Bonjour,
    j'utilise oracle 10.2, je possède une table A contenant un champ code en varchar2(10) qui contient des valeurs alphanumérique et purement numérique. Je reçois en paramètre d'une IHM un intervalle formé par des valeurs purement numérique : j'aimerais pouvoir vérifier que tous les éléments de cet intervalle n'existe pas dans ma table.
    Le problème c'est que lorsque j'écris quelquechose du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from A where code between '9' and '20'
    par exemple, ma requête risque de me ramener des valeurs comme '9A','10A'... voire '90'.

    J'ai aussi tenté d'écrire quelquechose du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select num_code from (
      select to_number(code) num_code from A where is_number(code)=1
    )
     where num_code between 9 and 20
    (avec is_number une fonction pl qui tente de caster la valeur reçue en number et renvoie 1 si cela réussi et 0 en cas d'exception.)
    mais à ce moment oracle m'indique que num_code n'est pas du bon type et cela ne marche que si je remet les côtes dans le between du coup je retouve mes valeurs '90'...

    La seule solution que je vois est de faire une boucle en pl/sql...
    Voyez-vous un autre moyen d'effectuer la requete?

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut ,


    Ce select me donne uniquement les code numériques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
      FROM (SELECT *
              FROM b
             WHERE LTRIM (code, '0123456789') IS NULL) b
     WHERE code BETWEEN '9' AND '60'

  3. #3
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Merci Salim mais ne revient-il pas au même que le mien dans le sens ou le 1er select est obligé de traiter des valeurs varchars : autement dit ne risque t il pas de me sortir la valeur '90' comme résultat entre '9' et '60'?
    Le problème est que justement je ne puisse pas écrire sans les cotes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
      FROM (SELECT *
              FROM b
             WHERE LTRIM (code, '0123456789') IS NULL) b
     WHERE code BETWEEN 9 AND 60

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    salut

    Essaie ce code je l'ai amélioré, il répond à ton problème
    Si j'ai un code '90' il ne va pas le selectionner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
      FROM (SELECT TO_NUMBER (code) AS num
              FROM b
             WHERE LTRIM (code, '0123456789') IS NULL)
     WHERE TO_NUMBER (num) BETWEEN 9 AND 60

  5. #5
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    Stop !

    Là, ce n'est pas un problème d'écriture de requête, c'est un problème de schémas !

    les requêtes que vous essayez d'obtenir seront catastrophiques d'un point de vue de performances !

    Donc commencez par revoir le schéma de la base...

  6. #6
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Merci Salim. Je prend note de ta remarque LeoAnderson : effectivement la structure aurait du être pensé autrement surtout qu'un grand nombre des requêtes que j'ai a traiter tourne autour des mêmes problématiques d'intervalles/recherche/comparaison que je ferais plus facilement avec des bornes purement numérique...mais je ne fais qu'hériter de ce schéma et cet existant : je ne peux le modifier.
    Je vais voir en terme de perf. ce que me donne la requete et comparer avec ce que me donne une boucle pl.
    Merci encore.

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

Discussions similaires

  1. [AC-2000] Recherche par date comprise dans un intervalle
    Par polo31 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/04/2020, 16h56
  2. Réponses: 3
    Dernier message: 10/08/2011, 10h17
  3. rechercher un textbox existant
    Par mic170 dans le forum C#
    Réponses: 6
    Dernier message: 20/07/2011, 15h17
  4. Réponses: 2
    Dernier message: 07/05/2010, 13h36
  5. Recherche FULL Text existe que dans MySql ?
    Par seb.49 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 01/06/2004, 22h30

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