Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#1 Thu 09 May 2019 14:12

bruhnild
Participant actif
Lieu: Lyon
Date d'inscription: 7 Jun 2014
Messages: 130

Extraire une requête SQL inscrite en dur dans une ligne

Bonjour,

J'ai une requete SQL écrite en dur (query dans la capture) dans une ligne de ma table A. Cette requête est un SELECT qui appelle des champs d'une table B. J'aimerais pouvoir exécuter cette requête et utiliser les valeurs renvoyées dans ma table A pour y faire un calcul à partir de la requête inscrite dans la colonne select_data.
Je n'arrive pas à comprendre comment extraire les informations de ma ligne sous ofrme de requete SQL.
J'espère avoir été assez claire dans mon explication.

Merci d'avance pour votre aide!

Dernière modification par bruhnild (Thu 09 May 2019 14:13)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Thu 09 May 2019 15:19

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1534

Re: Extraire une requête SQL inscrite en dur dans une ligne

Bonjour,

Vous pouvez passer par du code pour faire ca, en fabriquant la requete SQL a partir des valeurs des tables (si je comprends bien).
Exemple fait avec un block anonyme. Si vous devez retourner des valeurs, il faut le faire avec une fonction:

Code:

do language plpgsql $$
    DECLARE
        v_query       text;
        v_select_data text;
        v_newquery    text;
    BEGIN
        select query, select_data from tablea into v_query, v_select_data;
        v_newquery = format('create table res as with tmp as (%s) select %s as val from tmp', v_query, v_select_data);

        execute v_newquery;
    end;
    $$;

Vous pouvez aussi le faire sous forme de requete SQL et executer le résultat de cette requête avec psql (\gexec pour exécuter le dernier résultat de psql en tant que nouvelle requete SQL):

Code:

[local]:5532 nicolas@nicolas=# with tmp as (
    select id, query, select_data
    from tablea
) select format('with tmp as (%s) select %s as val from tmp;', query, select_data)
from tmp;
                                                              format                                                              
----------------------------------------------------------------------------------------------------------------------------------
 with tmp as (select codgeo as codgeo, p15_rp as log, p15_log as parc from tableb) select sum(log)*100/sum(parc) as val from tmp;
(1 row)

[local]:5532 nicolas@nicolas=# \gexec 
       val        
------------------
 83.3333333333333
(1 row)

Nicolas

Hors ligne

 

#3 Fri 10 May 2019 09:22

bruhnild
Participant actif
Lieu: Lyon
Date d'inscription: 7 Jun 2014
Messages: 130

Re: Extraire une requête SQL inscrite en dur dans une ligne

Bonjour,
Merci pour votre réponse. J'ai eu des difficultés à utiliser la fonction \gexec psql mais la solution avec DO fonctionne impeccablement.
Voici sa dernière version:

Code:

DO LANGUAGE plpgsql $$
    DECLARE
        v_query text;
        v_select_data text;
        v_id_geo text;
        v_newquery text;
    BEGIN

        SELECT query, select_data, id_geo FROM indicateur into v_query, v_select_data, v_id_geo ;
        v_newquery = (
 WITH tmp AS
    (SELECT id_geo,
            query,
            select_data
     FROM indicateur)
SELECT format('DROP TABLE IF EXISTS query; CREATE TABLE query AS WITH tmp as (%s) SELECT %s as data, codgeo as id_geo FROM tmp GROUP BY codgeo ;', query, select_data, id_geo) FROM tmp
LIMIT 1) ;


        execute v_newquery;

    END;
    $$;

Hors ligne

 

Pied de page des forums

Powered by FluxBB