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 :

Utiliser résultat d'une fonction dans un IN


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 45
    Points : 49
    Points
    49
    Par défaut Utiliser résultat d'une fonction dans un IN
    Bonjour à tous,

    j'ai une premiere fonction qui me retourne une liste de valeurs de la forme :

    var=1,2,3

    Je souhaite utiliser ce résultat dans une autre requete :

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select count(*)
    from a_table
    where col in (var);
    Cette requete retourne toujours 0 alors qu'elle ne devrait pas.

    La vraie requete est plus compliquée. De plus var est destiné à servir dans beaucoup de requetes donc je ne peux pas inclure la requete qui génère var.


    j'ai tenté d'avoir var sous la forme
    var = '1', '2', '3'
    Avec le même résultat.

    Quelqu'un sait-il comment résoudre ce problème ?

    Merci d'avance !

  2. #2
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 45
    Points : 49
    Points
    49
    Par défaut
    Bon j'ai testé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       req := 'select count(*) from table where col_val in (:1)';
     
       EXECUTE IMMEDIATE req INTO wnb USING list ;
    Si list = 1 ca fonctionne
    Si list =1,2 ca ne fonctionne pas

  3. #3
    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
    Peut-être que votre fonction retourne '1,2,3'.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Quelle est le type de la colonne col ? Numérique ou Caractères
    Quelle est la forme exacte de val ?
    1,2,3
    '1,2,3'
    '1','2','3'
    '1, 2, 3'
    ...

    Quel est le langage de votre code ?
    Puisqu'il semble que vous y prépariez votre requête, vous devez pouvoir y préparer une syntaxe correcte pour mettre ce qu'il faut dans IN, c'est à dire IN(1, 2, 3) si col est de type numérique et IN('1', '2', '3') si col est de type caractères.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    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 109
    Points : 28 437
    Points
    28 437
    Par défaut
    Citation Envoyé par Cofondinde Voir le message
    Bon j'ai testé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       req := 'select count(*) from table where col_val in (:1)';
     
       EXECUTE IMMEDIATE req INTO wnb USING list ;
    Si list = 1 ca fonctionne
    Si list =1,2 ca ne fonctionne pas
    En effet, la requête ainsi construite est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from table where col_val in ('1,2')
    , ce qui n'est sans doute pas ce que vous souhaitez
    Essayez comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       req := 'select count(*) from table where col_val in (' || list || ')';
     
       EXECUTE IMMEDIATE req INTO wnb  ;

  6. #6
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 792
    Points : 3 061
    Points
    3 061
    Par défaut
    Si je comprends votre exemple, 1, 2 et 3 correspondent à des enregistrements différents et pas un seul et uniquement enregistrement ayant le code "1,2,3".

    Sans utiliser une variable, c'est donc ceci que vous voudriez avoir, non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT count(*)
    FROM a_table
    WHERE col IN ('1','2','3');
    Voici un exemple qui devrait répondre à votre question

    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
     
     
    -- Création d'une fonction de type Tabel c-à-d qui retourne non pas une valeur mais un ensemble de valeur.
     
    CREATE FUNCTION dbo.udf_Test
    (    
    )
    RETURNS TABLE 
    AS
    RETURN 
    (
        -- Add the SELECT statement with parameter references here
        SELECT '1' As Col
        UNION 
        SELECT '2'
        UNION 
        SELECT '3'    
    )
     
    GO
     
    CREATE TABLE #Test (col char(1), Montant money null);
     
    INSERT INTO #Test VALUES ('1', 10);
    INSERT INTO #Test VALUES ('2', 20);
    INSERT INTO #Test VALUES ('3', 30);
    INSERT INTO #Test VALUES ('4', 40);
    INSERT INTO #Test VALUES ('5', 50);
    INSERT INTO #Test VALUES ('6', 60);
     
    -- Exemple d'utilisation de la fonction
     
    SELECT COUNT(*)
    FROM #Test
    WHERE col IN (SELECT * FROM [dbo].[udf_Test] ());
     
    DROP TABLE #Test;
     
    GO
     
    -- Cleaning.
     
    DROP FUNCTION dbo.udf_Test;
    GO

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

Discussions similaires

  1. Afficher le résultat d'une fonction dans une JList
    Par daviddu54 dans le forum Composants
    Réponses: 10
    Dernier message: 01/10/2008, 14h53
  2. Afficher le résultat d'une fonction dans une comboBox
    Par poussin_44 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 10/07/2007, 15h06
  3. Réponses: 3
    Dernier message: 30/11/2006, 06h25
  4. Récupérer le résultat d'une fonction dans une balise html
    Par Hayato dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/06/2006, 17h04
  5. Réponses: 6
    Dernier message: 08/06/2006, 10h07

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