PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 17/12/2008 00:31:25

bennkabazz
Membre

condition dans la creation de la vue

bonjour à tous
je veux creer une vue qui n'amène que 1 et  0 comme valeur ; 1 pour toutes les lignes où la colonne concernée de la table contient 1 et  0 dans tous les autres cas ,pour toutes les lignes de la table . c'est à dire , ma vue portera sur une colonne A de ma table , elle amènera 1 pour toutes les lignes où A = 1 et  0 pour toutes autres valeurs contenant A . j'ai fait assez de tentative pour cette  requette , car j'ai tenté d'utiliser "si" , mais ça marche pas ; aidez moi s'il vous plait .
merci d'avance

Hors ligne

#2 17/12/2008 00:55:46

luddic
Membre

Re : condition dans la creation de la vue

http://docs.postgresqlfr.org/8.3/functi … ional.html
http://www.postgresql.org/docs/8.3/inte … ional.html

Avec un exemple assez parlant:

SELECT * FROM test;

 a
---
 1
 2
 3


SELECT a,
       CASE WHEN a=1 THEN 'one'
            WHEN a=2 THEN 'two'
            ELSE 'other'
       END
    FROM test;

 a | case
---+-------
 1 | one
 2 | two
 3 | other

Donc ici un simple CASE nom_colonne WHEN 1 THEN 1 ELSE 0 END fait l'affaire.

Hors ligne

#3 17/12/2008 01:49:47

bennkabazz
Membre

Re : condition dans la creation de la vue

votre exemple est vraiment parlant , mais malhereusement il traite pas trop ma question;
je ne veux avoir dans ma colonne résulat que des 1 et des 0 selon que la colonne sur laquelle porte la vue, contient 1 ou autre valeur . 1 pour les lignes qui contiennent 1 et 0 pour les lignes qui contiennent autre valeur.
j'ai besoin de votre aide encore si possibles s'il vous plait

Dernière modification par bennkabazz (17/12/2008 01:51:55)

Hors ligne

#4 17/12/2008 11:26:15

luddic
Membre

Re : condition dans la creation de la vue

postgres=# CREATE TABLE test (id SERIAL PRIMARY KEY, a INT, b INT);
NOTICE:  CREATE TABLE will create implicit sequence "test_id_seq" for serial column "test.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_pkey" for table "test"
CREATE TABLE

postgres=# INSERT INTO test (a, b) SELECT ROUND(RANDOM() * 3), ROUND(RANDOM() * 10) FROM generate_series(0, 9);
INSERT 0 10

postgres=# SELECT * FROM test;
 id | a | b 
----+---+---
  1 | 0 | 4
  2 | 2 | 5
  3 | 1 | 6
  4 | 0 | 3
  5 | 1 | 3
  6 | 2 | 7
  7 | 1 | 1
  8 | 0 | 3
  9 | 2 | 9
 10 | 2 | 8
(10 rows)

postgres=# CREATE VIEW test_computed AS SELECT id, CASE a WHEN 1 THEN 1 ELSE 0 END as a, b FROM test;
CREATE VIEW

postgres=# SELECT * FROM test_computed ;
 id | a | b 
----+---+---
  1 | 0 | 4
  2 | 0 | 5
  3 | 1 | 6
  4 | 0 | 3
  5 | 1 | 3
  6 | 0 | 7
  7 | 1 | 1
  8 | 0 | 3
  9 | 0 | 9
 10 | 0 | 8
(10 rows)

Et si ça ne répond toujours pas à la question, il faudrait nous donner quelques exemples réels: données en entrée, et résultats voulus en sortie.

Hors ligne

#5 17/12/2008 13:38:04

bennkabazz
Membre

Re : condition dans la creation de la vue

bonjour
merci d'abord pour votre assistance.
c'est à dire je veux un truc comme ça :
colonne A de ma table ={1, 3,7,9,0,1,5,1,6,1}
si  je fais

create view mavue (colonne1) as select colonne2 from matable machin ...............;

et en plus  si  je fais

select * from mavue;

je veux avoir colonne1={1,0,0,0,0,1,0,1,0,1}   
partout où y avait 1 dans la colonne2 de ma table  reste à 1 , mais partout où y avait autre valeur sont transformé à 0.
merci d'avance

Dernière modification par bennkabazz (17/12/2008 13:39:42)

Hors ligne

#6 18/12/2008 10:09:05

gleu
Administrateur

Re : condition dans la creation de la vue

Il suffisait d'utiliser la première réponse de luddic et de l'adapter à ton besoin :

CREATE VIEW mavue (colonne1) AS
    SELECT
       CASE WHEN a=1 THEN 1
            ELSE 0
       END
    FROM matable;

Guillaume.

Hors ligne

#7 18/12/2008 23:41:15

bennkabazz
Membre

Re : condition dans la creation de la vue

merci beaucoup  à  vous tous ; il fait mon affaire .
très sympa

Dernière modification par bennkabazz (18/12/2008 23:53:32)

Hors ligne

#8 19/12/2008 10:34:19

SAS
Membre

Re : condition dans la creation de la vue

Juste une remarque...

Lorsque vous posez une question sur les forums, ne vous attendez pas systématiquement à obtenir la réponse idéale à votre question. La réponse qui fera que vous n'avez même pas à réfléchir un tantinet pour l'adapter à votre besoin.

Lorsque vous utilisez les forums ou les listes de discussion, ou irc, on attend de vous que vous posiez une question qui explique clairement votre besoin et votre problème, et quand retour vous sachiez analysez une réponse et l'adapter à votre besoin.

Il ne faut pas croire que les gens qui donnent de leur temps pour vous aider sont à votre service.


Stéphane Schildknecht
Conseil, formations et support PostgreSQL
http://www.loxodata.com

Hors ligne

#9 22/12/2008 12:07:12

bennkabazz
Membre

Re : condition dans la creation de la vue

bonjour
il marche bien cette requête de création de la vue car il renvoi le résultat désireux , mais parcontre il renvoie 36 enregistrements étant donné que j'en ai 6 dans ma table , j'ai l'impression qu'il multiplie les 6 enregistrements par 6 pour en faire à 36 ; aidez moi s'il vous plait .
voici la requête :

CREATE VIEW mavue (colonne1) AS
    SELECT
       CASE WHEN a=1 THEN 1
            ELSE 0
       END
    FROM matable;

Hors ligne

#10 22/12/2008 16:31:51

gleu
Administrateur

Re : condition dans la creation de la vue

Excuse-moi, mais tes questions commencent à devenir du grand n'importe quoi. Tu as six éléments dans ta table, la vue en renvoie 36 et t'imagines que PostgreSQL multiplie les enregistrements par 6. Moi, je crois qu'il en a ajouté 30, juste pour se marrer. Merde, c'est n'importe quoi.

Le nombre d'enregistrements renvoyés par la vue correspond au nombre d'enregistrements de la table. Point.


Guillaume.

Hors ligne

#11 22/12/2008 17:55:45

bennkabazz
Membre

Re : condition dans la creation de la vue

non vous n'avez pas à vous excusé , je ne prends pas en mal , quand on est à la recherche du savoir on se plie ;
je suis assez étonné aussi par le résultat , mais peut être , comme je joins  la vue calculée à la vue qui a permis à son calcul, l'erreur doit se trouver à ce niveau , car , si je crée une table simple de 6 enregistrement et appliquer la requête , il renvoie 6 enregistrement comme vous l'avez dit .
je suis encore désolé
merci pour vos assistances

Hors ligne

#12 21/11/2012 13:03:06

Christof
Membre

Re : condition dans la creation de la vue

Bonjour. J'ai un soucis sur une requête conditionnelle que je ne parviens pas à réaliser. Voici mon cas : Je souhaite créer une vue qui contient des information de plusieurs tables, dans 2 bases de données (avec un dblink).
Tout fonctionne, sauf que le résultat n'est pas celui que j’attends : j'ai 40 communes, dans lesquelles je souhaite faire apparaitre, pour l'ensemble des communes, les informations souhaitées. Dans cet exemple, je veux faire apparaitre la somme des longueurs de tronçon d'autoroute, par commune. Seulement, toutes mes communes ne sont pas traversées par l'autoroute. Résultat lorsque j'applique cette requête, apparaissent seulement les information sur les communes qui ont une longueur totale > 0. Pour els autres communes, je perd tous les enregistrements.

CREATE OR REPLACE VIEW view_test3
AS SELECT 
	id, 
	geom, 
	code_insee, 
	long_voirie_a
FROM 
	info_com, 
	dblink('hostaddr=xxx port=xxx dbname=xxx user=xxx password=xxx', 'select code_insee, sum("long_carto_troncon") FROM bd_adresse WHERE "domanialite" = ''Autoroute'' GROUP BY code_insee ORDER BY code_insee')as foo (code integer, long_voirie_a double precision )

WHERE 
	code_insee=foo.code
		
GROUP BY 
	code_insee, id, geom, commune, long_voirie_a
;

J'ai donc essayé avec un SELECT CASE, de la manière suivante :

CREATE OR REPLACE VIEW view_test3
AS SELECT 
	id, 
	geom, 
	code_insee, 
	long_voirie_a,
		CASE 
			WHEN long_voirie_a <> 0 THEN long_voirie_a
                        ELSE long_voirie_a = NULL
		END
FROM 
	info_com, 
	dblink('hostaddr=xxx port=xxx dbname=xxx user=xxx password=xxx', 'select code_insee, sum("long_carto_troncon") FROM bd_adresse WHERE "domanialite" = ''Autoroute'' GROUP BY code_insee ORDER BY code_insee')as foo (code integer, long_voirie_a double precision )

WHERE 
	code_insee=foo.code
		
GROUP BY 
	code_insee, id, geom, commune, long_voirie_a
;

Mais rien à faire, j'ai toujours ce champ qui me contraint à ne garder que les enregistrements qui sont traversés par une autoroute.
Voyez-vous ou j'ai pu commettre une erreur ? Merci beaucoup.

Hors ligne

#13 21/11/2012 23:13:59

gleu
Administrateur

Re : condition dans la creation de la vue

À moins que je n'ai pas compris ce que vous vouliez faire, il faudrait placer le CASE au niveau du sum.


Guillaume.

Hors ligne

Pied de page des forums