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

PostgreSQL Discussion :

[SQL] porter une fonction MySql sur PostgreSQL


Sujet :

PostgreSQL

  1. #1
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  2. #2
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    Bonjour,

    Ayant effectué plusieurs recherches, je suis arrivé à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    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

  4. #4
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    Merci, GrandFather, pour votre réponse, j'arrive à ceci;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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,

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Je verrais bien un truc comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    Merci infiniment, vous m'avez vraiment rendu un fier service !!!

  7. #7
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    heu, 'parlé trop vite
    Ca marche très bien mais, comment faire pour un varargs?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test_qcm(champ,int,champ,int,champ,int,champ,int)
    Encore merci

  8. #8
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    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

  9. #9
    Membre averti

    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 338
    Points : 404
    Points
    404
    Par défaut
    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
    Consultant Odoo
    Python / PostgreSQL

  10. #10
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    Merci, donc la seule possibilité est d'enregistrer la fonction plusieurs fois avec un nombre différent d'arguments ?

Discussions similaires

  1. [MySQL] ExceptionHandler sur une fonction mysql
    Par Moustico dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/09/2010, 21h08
  2. Sauvegarde d'une base MySQL sur SQL Server
    Par xave dans le forum Administration
    Réponses: 4
    Dernier message: 19/09/2006, 10h32
  3. afficher les resultats d'une requete mysql sur 3 colonnes
    Par harlock59 dans le forum Requêtes
    Réponses: 7
    Dernier message: 24/12/2005, 14h38
  4. [VB.NET] Exécuter une fonction VB sur un Datagrid
    Par MiJack dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/09/2004, 14h45
  5. Connecter Delphi 7 et une bd mysql sur un poste distant
    Par nordine001 dans le forum Bases de données
    Réponses: 5
    Dernier message: 23/08/2004, 14h40

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