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

Requêtes PostgreSQL Discussion :

Where et sélection d'une autre row si et seulement si une première est introuvable [8.4]


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut Where et sélection d'une autre row si et seulement si une première est introuvable
    Bonjour,

    Je n'aime pas beaucoup embêter les autres avec mes questions et me débrouille quasiment tout seul, mais là je sèche...

    Mon problème est que j'ai une vue de tags, contenant tout les tags sous toutes les versions linguistiques. En gros, je peux avoir deux tags avec un même id, mais ayant un id de langue (relation vers une tables de référence) différent. De plus, si tout les tags ont forcément une traduction en anglais, il n'en ont pas forcément une dans toutes les autres langues.

    Je souhaiterais pouvoir récupérer tout les tags en français, et si un tag en français n'existe pas, me retourner à la place celui en anglais (qui existe forcément donc). Est-ce possible ??

    Ce serait donc une sorte de "XOR", mais dans le cas où aucune row ne correspond aux critères. C'est certainement une solution très bête, une sous-requête ou quoi, et je cherche trop loin, mais là je trouve pas du tout... J'aimerai avoir une piste où rechercher...


    Merci d'avance !!

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut
    Ok, j'ai honte, c'était en effet très simple, il suffisait d'utiliser EXISTS... Je sentais la sous-requête, sans voir l'évident. Pour info, la fonction une fois bonne :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    CREATE OR REPLACE FUNCTION get_definers_ltree(IN param_language integer, IN param_allowed_languages integer[], IN param_tag_id integer DEFAULT 0)
      RETURNS TABLE(definer_id integer, definer_parent_id integer, definer_label character varying, definer_path ltree, translation_done boolean) AS
    $BODY$
     
      DECLARE
        tag view_tags_definers%ROWTYPE;
     
      BEGIN
     
      RETURN QUERY SELECT definer.id, definer.parent_tag_id, definer.label, definer.path,
    		      CASE WHEN count(tag_trans.id) < array_length(param_allowed_languages, 1) THEN false ELSE true END
    	FROM view_tags_definers definer
    	JOIN tags_translations tag_trans ON tag_trans.tag_id = definer.id AND tag_trans.language_id = ANY(param_allowed_languages)
    	WHERE definer.path ~ cast('*.' || param_tag_id::text || '.*'  AS lquery) AND
    		((EXISTS (SELECT 1 FROM view_tags_definers WHERE id = definer.id AND language_id = param_language) AND definer.language_id = param_language) OR
    		(NOT EXISTS (SELECT 1 FROM view_tags_definers WHERE id = definer.id AND language_id = param_language) AND definer.language_id = 1))
            GROUP BY definer.id, definer.parent_tag_id, definer.label, definer.path;
     
      END
      $BODY$
      LANGUAGE plpgsql;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/06/2014, 11h50
  2. Réponses: 2
    Dernier message: 29/09/2009, 15h33
  3. Réponses: 8
    Dernier message: 11/08/2005, 09h32
  4. Réponses: 2
    Dernier message: 17/06/2005, 13h38
  5. Réponses: 5
    Dernier message: 26/09/2004, 19h38

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