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 :

[SQLSERVER] comparer un chiffre issu d'une chaine de caractere a une constante


Sujet :

Langage SQL

  1. #1
    Membre régulier Avatar de igorzup
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 307
    Points : 107
    Points
    107
    Par défaut [SQLSERVER] comparer un chiffre issu d'une chaine de caractere a une constante
    Bonjour,

    Je tourne sur le net sans avoir de reponse (uniquement SQLSERVER).

    Je dois ecarter dans ma clause where les lignes dont un chiffre, a extraire d'une chaine de caractère, est inférieur a un autre passé en constante.
    ou:
    Je peux aussi m'en sortir en comparant des dates et en écartant celles qui sont plus vielles qu'une donnée en constante.

    La première méthode me donnera cependant des résultats plus fiables...

    Grand merci de votre aide!

  2. #2
    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 388
    Points
    18 388
    Par défaut
    Il va vous falloir broder un peu, parce qu'il est difficile d'aller plus loin que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM MyTable
    WHERE CAST(SUBSTRING(MyColumn, x, y) as integer) < MyConstante

  3. #3
    Membre régulier Avatar de igorzup
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 307
    Points : 107
    Points
    107
    Par défaut
    je viens de passer par la.

    et par une table temporaire (je met dans cette table uniquement les lignes qui pourront etre transformées.

    ensuite j'applique la même requête que vous.

    le problème c'est que j'effectue donc deux requête ce qui semble poser problème au driver SQL JDBC:ODBC que j'utilise puisqu'il ne cree pas de ResultSet...

    DONC:
    il faut donc que je supprime le passage par la table temporaire

    DONC:
    Il faut que la requete fonctionne meme si certaines lignes ne permettent pas le cast

    et la, je bloque pour l'instant

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Pour ta première question, à moins que ce soit trop lourd, tu peux souvent utiliser une table dérivée ou une CTE pour simuler la table temporaire.

    Pour la seconde, il te suffit de tester si le résultat est bien numéric !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * FROM MyTable
    WHERE CASE ISNUMERIC(SUBSTRING(MyColumn, x, y)) 
    WHEN 1 THEN CAST(SUBSTRING(MyColumn, x, y) AS integer) 
    ELSE MyConstate + 1 END < MyConstante
    En gros, si c'est numéric, tu fais ton test, sinon, tu fais un test bidon (MyCst +1 < MyCst) qui retourne false.

  5. #5
    Membre régulier Avatar de igorzup
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 307
    Points : 107
    Points
    107
    Par défaut
    merci pacman mais ca passe po!

    la requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT     dbo.F_COMPTET.CT_Intitule, dbo.F_COMPTET.CT_Siret, dbo.F_ECRITUREC.EC_Date, dbo.F_ECRITUREC.EC_RefPiece, dbo.F_ECRITUREC.EC_Intitule, dbo.F_ECRITUREC.EC_Montant, dbo.F_ECRITUREC.EC_Sens
    FROM       dbo.F_COMPTET LEFT OUTER JOIN
                  dbo.F_ECRITUREC ON dbo.F_COMPTET.CT_Num = dbo.F_ECRITUREC.CT_Num
    WHERE     (dbo.F_COMPTET.CT_Num LIKE '41LM%') AND (dbo.F_COMPTET.CT_Num NOT LIKE '41LMBE%') AND (dbo.F_ECRITUREC.EC_Lettrage = '') AND (dbo.F_ECRITUREC.EC_RefPiece LIKE '% FA') AND 
                  CASE ISNUMERIC(SUBSTRING(EC_RefPiece, 1, 6)) 
                  WHEN 1 THEN CAST(SUBSTRING(EC_RefPiece, 1, 6) AS integer) > 123500
                  ELSE MyConstante + 1 END < MyConstante
    il bloque sur l'operateur '>' qui ne lui posait pas de probleme avant


    pour la table dérivée ou la CTE... j'avoue ne pas connaitre (j'ai juste utilisé une #tmp a la procédure stockée)

    Au passage tu va m'en vouloir de ne pas avoir retiré le OUTER JOIN... j'avais pas pigé non plus...

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Mince, je crois me souvenir de toi... tu es le gars qui ne peut pas faire de WITH ?
    (dans ce cas, WITH = CTE).

    Sinon, une petite explication du CASE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CASE X 
    WHEN Value THEN Ret1 
    WHEN Value2 
    THEN Ret2 ELSE Ret3 END
    - Le bloc entier est une expression. C'est une valeur unique, comme si tu sélectionnes une colonnes
    - X, c'est la valeur que tu testes
    - Value, Value2, ce sont les valeurs possibles
    - ELSE, c'est si aucune des valeurs précédentes n'est la bonne
    - Ret1, Ret2, Ret3 : ce sont les valeurs correspondant à chacun des cas. Tu n'en renvoies qu'une seule.

    Donc là, l'idée, c'est que ton CASE renvoie soit la valeur CASTEE si c'est un numérique, soit MyConstante + 1.
    Et le résultat de cette chose, tu le compares à ta constante.

    Donc le "> 123500" n'a rien à faire là où il est ...

    Tu vois le principe ?

    [EDIT]
    Allez, petit supplément parce que c'est toi.
    Le principe du CASE est donc d'évaluer une variable et de retourner une valeur correspondante (un peu comme dans tous les langages )
    Tu as une deuxième forme possible, où tu n'évalues pas forcément les valeurs d'une variable donnée, mais différentes expresssion !

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT CASE WHEN TaColonne = 1 THEN Ret1
    WHEN UneColDate = getdate() THEN Ret2
    ELSE RET3 
    END

  7. #7
    Membre régulier Avatar de igorzup
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 307
    Points : 107
    Points
    107
    Par défaut
    okaaaaaaaaaaaaay!

    mais alors ou je teste ma valeur quand je sais qu'elle est numerique?

    [EDIT : stoupido stoupido.... je vais le mettre apres le then allez!]

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Hey, relis bien ce que je te dis !

    [EDIT]
    Bon allez, je la refais. (Tain, chuis vraiment en forme ce soir...)
    CASE ... WHEN ... THEN ... ELSE ... END
    => Renvoie le CAST si c'est castable, sinon ce que tu veux (ce que tu mets dans le ELSE)

    CASE ... WHEN ... THEN ... ELSE ... END < TonMachinATester
    => C'est le tester
    Bien sûr, tu peux manipuler le fameux CASE comme tu le sens, comme tu le ferais pour une colonne.

  9. #9
    Membre régulier Avatar de igorzup
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 307
    Points : 107
    Points
    107
    Par défaut
    merci d'avoir re-re-posté moi chui pas en forme...
    Syntaxe bizarre quand meme...

    je teste.

    moult merci pour la pedagogie... comme d'ab!

  10. #10
    Membre régulier Avatar de igorzup
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 307
    Points : 107
    Points
    107
    Par défaut
    you houuuu!

    merci.

    pour les nuls (comme moi) qui pourraient se reservir du post, v'la la reponse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    AND 
    (CASE ISNUMERIC(SUBSTRING(EC_RefPiece, 1, 6)) 
    WHEN 1 THEN CAST(SUBSTRING(EC_RefPiece, 1, 6) AS integer)
    ELSE 1 
    END > 123500)

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 18/01/2008, 19h53
  2. erreur pour une insertion d'une chaine de caractere dans une cellule
    Par amel95140 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/10/2006, 09h09
  3. Extraire le premier caractere d'une chaine de caractere
    Par Shikamaru86 dans le forum C++Builder
    Réponses: 6
    Dernier message: 21/09/2006, 09h14
  4. comparer une valeur de formulaire et une chaine de caractere.
    Par minirom dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/08/2006, 10h53
  5. Réponses: 2
    Dernier message: 04/11/2005, 11h35

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