Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/05/2006, 19h17   #1
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 20
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
Par défaut [SQL] porter une fonction MySql sur PostgreSQL

Bonjour,

Je vous demande de l'aide parce que je suis un peu perdu
Jusqu'ici, je travaillais avec Mysql, j'utilisais une requête de ce style sur une table 'questions' contenant des champs numériques Q1,Q2,Q3,Q4....;
Code :
1
2
3
4
5
6
 
SELECT (IF((Q10&(1<<0))&&(Q11&((1<<3))),1,0) +
IF((Q28&(1<<0))&&(Q29&((1<<3))),1,0) +
IF((Q103&(1<<0))&&(Q104&((1<<3))),1,0) +
IF((Q122&(1<<0))&&(Q123&((1<<3))),1,0) +
IF((Q140&(1<<0))&&(Q141&((1<<3))),1,0) ) AS total FROM questions;
Je voudrais migrer vers PostgreSQL...Seulement, je ne vois pas comment m'y prendre...
j'aimerais utiliser la fonction comme en mysql
Code :
IF(expression,return_if_true,return_if_false)
autre chose:
n'est pas valide en PostgreSQL...

J'ai besoin d'aide...

Je vous en remercie d'avance...
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2006, 20h54   #2
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 20
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
Bonjour,

Ayant effectué plusieurs recherches, je suis arrivé à ceci:
Code :
1
2
3
4
5
6
7
SELECT (
CASE WHEN (Q10&(1<<0))!=0 AND (Q11&((1<<3)))!=0 THEN 1 END+
CASE WHEN (Q28&(1<<0))!=0 AND (Q29&((1<<3)))!=0 THEN 1 END+
CASE WHEN (Q103&(1<<0))!=0 AND (Q104&((1<<3)))!=0 THEN 1 END+
CASE WHEN (Q122&(1<<0))!=0 AND (Q123&((1<<3)))!=0 THEN 1 END+
CASE WHEN (Q140&(1<<0))!=0 AND (Q141&((1<<3)))!=0 THEN 1 END
) AS total FROM entrees;
Seulement, si Q10 est null, j'ai toute mon addition ratée...

Un autre problème; ne pourrais-je pas alléger ma requête avec une FUNCTION en pl/pgsql ?

Auriez-vous des idées ?

Merci d'avance pour votre aide...

Cordialement,

Spilliaert.
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2006, 10h31   #3
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Bonjour,

Citation:
Envoyé par spilliaert
Seulement, si Q10 est null, j'ai toute mon addition ratée...
La fonction COALESCE devrait résoudre le problème.

Par contre, je ne comprends pas la signification de l'expression Q10&(1<<0) ; un simple Q10 & 1 ne suffirait pas ?
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2006, 17h16   #4
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 20
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
Merci, GrandFather, pour votre réponse, j'arrive à ceci;
Code :
1
2
3
SELECT (
CASE WHEN COALESCE((Q10&(1<<0))!=0,false) AND COALESCE((Q11&((1<<3)))!=0,false) THEN 1 END+
CASE WHEN COALESCE((Q10&(1<<0))!=0,false) AND COALESCE((Q13&((1<<3)))!=0,false) THEN 1 END) AS total FROM entrees;
Citation:
Par contre, je ne comprends pas la signification de l'expression Q10&(1<<0) ; un simple Q10 & 1 ne suffirait pas ?
oui, mais je travaille comme ça en développement, c'est plus "visuel" car ça représente un choix de formulaire (Q12&(1<<0)==>1er choix etc.)

Ne pourriez-vous pas m'indiquer comment faire (ou me faire ) une fonction en pl/pgsql ou pl/... qui aurait le même effet que le if(exp.,if_true,if_false_or_null) de ma première requête MySql ? une fonction qui rendrait ma requête portable (parce que j'en ai beaucoup comme ça )

Comme ceci;
Code :
1
2
3
4
5
SELECT (IF((Q10&(1<<0))&&(Q11&((1<<3))),1,0) +
IF((Q28&(1<<0))&&(Q29&((1<<3))),1,0) +
IF((Q103&(1<<0))&&(Q104&((1<<3))),1,0) +
IF((Q122&(1<<0))&&(Q123&((1<<3))),1,0) +
IF((Q140&(1<<0))&&(Q141&((1<<3))),1,0) ) AS total FROM questions;
Merci d'avance pour votre aide...

Cordialement,
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2006, 17h42   #5
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Je verrais bien un truc comme cela :
Code :
1
2
3
CREATE OR REPLACE FUNCTION test_qcm(int4, int4, int4, int4) RETURNS int4 AS 
'SELECT CASE WHEN COALESCE(($1 & (1<<$2))!=0,false) AND COALESCE(( $3 &((1<<$4)))!=0,false) THEN 1 ELSE 0 END' 
LANGUAGE 'sql';
Ta requête devient alors :
Code :
SELECT test_qcm(Q10, 0, Q11, 3) + test_qcm(Q28, 0, Q29, 3) + ... AS total FROM entrees;
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2006, 18h00   #6
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 20
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
Merci infiniment, vous m'avez vraiment rendu un fier service !!!
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2006, 18h18   #7
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 20
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
heu, 'parlé trop vite
Ca marche très bien mais, comment faire pour un varargs?

Code :
test_qcm(champ,int,champ,int,champ,int,champ,int)
Encore merci
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2006, 17h47   #8
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 20
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
up

Comment pourrait-on faire pour qu'un nombre variable d'argument puisse être accepté par la fonction ?

Ou est-ce que j'enregistre la fonction avec 2,3,4,.. arguments ?

Merci d'avance pour votre aide...

Cordialement,

Spilliaert
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2006, 19h43   #9
Membre éclairé
 
Inscription : janvier 2005
Messages : 336
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2005
Messages : 336
Points : 353
Points : 353
Une fonction portant le meme nom peut être creer plusieurs fois avec un nombre différent d'argument.

Voir les fonctions existantes dans les catalogues systèmes
__________________
Christophe Chauvet (KrysKool)
kryskool est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2006, 20h30   #10
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 20
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
Merci, donc la seule possibilité est d'enregistrer la fonction plusieurs fois avec un nombre différent d'arguments ?
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h33.


 
 
 
 
Partenaires

Hébergement Web