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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    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 éclairé Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    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 confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    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 éclairé Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    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 confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    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 éclairé Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

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

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