Vous n'êtes pas identifié(e).
Sous PostgreSQL, false<true
Ce qui est dangereux, c'est que ça dépend vraiment de comment le SGBD trie les booleens. Je doute donc que ça soit très portable d'un SGBD à l'autre.
A la lueur de cette explication, j'ai essayé ceci :
select * from actes order by ccam != 'ZZLP025'
et ceci
select * from actes order by ccam = 'ZZLP025' desc
et ça marche !
Oui,
ça sent le tir groupé du vendredi après midi de ceux qui moulent devant leur poste parce qu'il est définitivement trop tard pour commencer un truc plus important.
Cordialement
Oui, c'est possible. Si ta colonne s'appelle pays, ça peut donner quelque chose comme : ORDER BY pays='France', pays
Bonjour,
je viens d'essayer sur une table que j'ai sous la main, et il faut que j'écrive ceci pour avoir l'acte ZZLP025 en premier, puis les auttres dabs le bon ordre :
select * from actes order by ccam = 'ZZLP025' desc, ccam asc
Cordialement
Effectivement,
mais j'avais d'autres projets pour eux (les stocker dans une table).
Mais je vais quand même les caster dans un premier temps.
Merci du coup du main
Effectivement, ça pourrait être une solution mais :
- tout les champs renvoyés ne sont pas du même type
- idnum sera présent quoiqu'il arrive.
J'ai bien imaginé une alternative, mais elle me parait lourdingue. Dans ma table qualito, le pourrait avoir une colonne qui indiquerai le nombre de champs renvoyé par la requête "query", ce que je pourrait ensuite traité avec des if - elsif - then puisque je ne pense renvoyer de 1 à 4 champs grand max.
Sinon, il faudrait que je trouve un truc du style d'un array qui accepte le mélange de type.
Cordialement
Hello,
ce n'est pas le nombre de paramètres qui change, c'est le nombre de champ renvoyés.
la partie qui est concernée est la suivante :
FOR result in EXECUTE qual.query using datdeb, datfin LOOP
RAISE NOTICE '%', result;
END LOOP;
le RECORD "result" pourrait avoir 1 à n champs, et c'est le nombre de champ de "result" que je souhaitera compter.
Pour être plus clair, sur mes deux requêtes de la table qualito, l'une cherche les codes postaux imprécis, l'autre les code postaux non renseignés.
La première me renvoie idnum plus la valeur du code postal incriminé, l'autre n'a besoin de me renvoyer que l'idnum. Donc mon result pourrait avoir 1 ou 2 champs dans ce cas, et c'est ce que je cherche à compter.
Cordialement
Bonjour,
cherchant à améliorer les choses, il me reste deux choses à élucider.
Sachant que les requêtes stockés dans la table qualito pourront renvoyer 1..n champs, y'a-t il un moyen de compter le nombre de champs d'un type RECORD ?
En relation avec la première question, plutôt que d'appeler chaque champ du RECORD ou du ROWTYPE par son nom, y-a t-il un moyen de l'appeler par son ordre (un peu comme quand on fait un ORDER BY 1,3 DESC par exemple)?
Cordialement
Bonjour,
finalement j'ai réussi à coup de FOR...LOOP
Pour ceux que ça pourraient intéresser, voila le résultat:
DROP TABLE IF EXISTS testing;
CREATE TABLE testing(
idnum INTEGER,
datsor DATE,
codpos CHAR(5)
);
INSERT INTO testing (idnum, datsor, codpos) VALUES
(1,'2010-01-03','13005'),
(2,'2009-12-27','13999'),
(3,'2010-02-12','13999'),
(4,'2010-01-25',NULL);
DROP TABLE IF EXISTS qualito;
CREATE TABLE qualito(
idqry INTEGER,
query VARCHAR,
libqry VARCHAR
);
INSERT INTO qualito VALUES (1,'select idnum, codpos from testing where codpos like ''%999'' and datsor between $1 and $2;','Code postal imprécis');
INSERT INTO qualito VALUES (2,'select idnum, codpos from testing where codpos is null and datsor between $1 and $2;','Code postal vide');
CREATE OR REPLACE FUNCTION plop(datdeb date, datfin date)
RETURNS VOID AS
$BODY$
DECLARE
lstqry CURSOR FOR SELECT idqry, query, libqry FROM qualito;
qual qualito%ROWTYPE;
result RECORD;
BEGIN
RAISE NOTICE 'Bornes des séjours : % à %', TO_CHAR(datdeb,'DD/MM/YYYY'),TO_CHAR(datfin,'DD/MM/YYYY');
FOR qual IN lstqry LOOP
RAISE NOTICE 'Exécution de la requête: % - %', qual.idqry, qual.libqry;
FOR result in EXECUTE qual.query using datdeb, datfin LOOP
RAISE NOTICE '%', result;
END LOOP;
END LOOP;
END;
$BODY$
LANGUAGE PLPGSQL VOLATILE;
select plop(to_date('20100101','YYYYMMDD'),to_date('20101231','YYYYMMDD'));
Ok, merci déjà pour ça qui m'enlève une épine du pied.
J'ai aussi testé ça qui semble fonctionner :
WHILE FETCH v_cursor INTO v_record LOOP
-- instructions
END LOOP;
Cordialement
PS : j'avais oublié de dire que je suis débutant en plpgsql (et en création de function) mais je crois que ça s'est vu!
Bonjour,
suite à cette discussion [url]http://forums.postgresql.fr/viewtopic.php?id=1026[url], je me lances dans l'écriture d'une procédure, avec pour paramêtres des dates (debut et fin) qui devra aller lire une table de requête et les exécuter une a une avec les paramêtres de dates passés (jexpère être clair). A terme, je souhaiterai que les résultats de chaque requête soit écrit dans une table mais dans un premier temps, je vais me contenter d'un affichage écran.
Voila ou j'en suis:
drop table if exists testing;
create table testing(
idnum integer,
datsor date,
codpos char(5)
);
insert into testing (idnum, datsor, codpos) values
(1,'2010-01-03','13005'),
(2,'2009-12-27','13999'),
(3,'2010-02-12','13999');
drop table if exists qualito;
create table qualito(
idqry integer,
query varchar,
libqry varchar
);
insert into qualito values (1,'select idnum, codpos from testing where codpos like ''%999'' and datsor between $1 and $2;','Code postal imprécis');
CREATE OR REPLACE FUNCTION plop(datdeb date, datfin date)
RETURNS VOID AS
$$
DECLARE
id INTEGER;
req VARCHAR;
lib VARCHAR;
lstqry CURSOR FOR SELECT * FROM qualito;
BEGIN
OPEN lstqry;
FETCH lstqry INTO id, req, lib;
WHILE FOUND LOOP
RAISE NOTICE '%,%,%', id, req, lib;
END LOOP;
END;
$$
LANGUAGE PLPGSQL
VOLATILE
COST 100;
select plop(to_date('20100101','YYYYMMDD'),to_date('20101231','YYYYMMDD'));
Je sèche un peu pour ouvrir une deuxième boucle dans la première (avec un nouveau curseur sur la requête lu dans la table qualito).
L'autre probleme est le comportement de ce code! il boucle et m'affiche plusieur fois le message RAISE NOTICE alors qu'il devrait ne le faire qu'une fois puisqu'il n'y a qu'une requete dans la table qualito.
Cordialement
Super,
merci beaucoup, je vais creuser tout ça.
Cordialement
Bonjour,
bon, c'est bien ce à quoi je pensait alors. Une procédure stockée me convient parfaitement. On va essayer de faire ça.
connaissez vous un projet libre avec ce type de chose que je puisse aller m'inspirer du code ?
sous quelle forme dois-je stocker mes requêtes ? un simple varchar suffirat-il ?
Cordialement
Bonjour,
dans le cadre d'un traitement de contrôle qualité sur mes données, je suis amené à exécuter près de 250 requêtes régulièrement. Actuellement, je fait ça à partir d'un source que je lance avec "psql -f".
N'y a t'il pas moyen de stocker les requêtes dans une table et de les exécuter à partir de cette dernière ? que faire s'il y a des paramètres à passer dans la requête ? Je souhaiterai également stocker les résultats dans une autre table (N° du dossier, Identifiant de la requête positive).
Bref, toutes pistes sur l'intérêt et la façon de réaliser ça sera bienvenue.
Cordialement
PS : si je ne suis pas clair, n'hésitez pas à le faire savoir.
Bonjour,
j'arrive un peu après la bataille mais il y aurai eu aussi ceci de possible :
SELECT sum (case when a=1 then 1 else 0 end), sum (case when a=2 then 1 else 0 end) from test;
Je ne sais pas ce qui est le plus rapide !
Cordialement