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 :

Requête sur colonne de type créé par l'utilisateur


Sujet :

Requêtes PostgreSQL

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut Requête sur colonne de type créé par l'utilisateur
    Bonjour à tous

    Je suis embêté sur une requête "select" sur une colonne d'un type créé artificiellement.

    En effet, je crée un type "xxx" via create type ... puis je crée ma table contenant une colonne de ce type puis j'insère des données. Jusque là ça va.
    Mais quand je veux requêter sur cette colonne ça me répond "cannot compare dissimilar column types character and unknown at record column 1". Je comprends bien que ma syntaxe n'est pas bonne mais je n'ai pas réussi à trouver comment l'écrire.

    Par exemple voici un code minimaliste mais complet de mon souci
    Code sql : 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
    drop database if exists "bdd_test";
    create database "bdd_test"
    	template = "template0"
    	encoding = 'utf8';
    \connect "bdd_test"
     
    create type "complex" as (
    	"reel" smallint,
    	"img" smallint
    );
    comment on type "complex" is 'Type nombre complexe';
     
    create table "calcul" (
    	"id_calcul" integer not null check ("id_calcul" > 0),
    	"nbr" "complex" not null,
    	primary key("id_calcul")
    );
     
    insert into calcul values(1, row(2, -2));
    select * from calcul;
    select * from calcul where nbr=row(2, -2);

    C'est ce dernier select qui ne fonctionne pas et je n'arrive pas à trouver la syntaxe exacte pour faire ma requête. Pourtant ça me semblait logique de l'écrire comme pour l'insert...

    Donc voilà, je suis bloqué et espère votre aide.

    Merci à tous de votre attention.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 133
    Points
    53 133
    Billets dans le blog
    6
    Par défaut
    Si vous voulez créer des nouveaux types il faut aussi créer les opérateur pour ces types (comparaison et opérationnels)....

    Il ne peut pas deviner comment manipuler les données...

    A +

  3. #3
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut
    Un exemple ici.
    @+

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Si vous voulez créer des nouveaux types il faut aussi créer les opérateur pour ces types (comparaison et opérationnels)....

    Il ne peut pas deviner comment manipuler les données...
    Mouais. Ca parait logique effectivement mais j'avais benoîtement espéré qu'en voyant 2 champs dans le type et 2 champs dans le "row" il pourrait "deviner" qu'il faut les comparer en parallèle deux à deux...


    Citation Envoyé par alassanediakite Voir le message
    Un exemple ici.
    Merci Super sympa
    J'ai appris des trucs qui, même si c'est inutile ici (voir plus bas) me serviront probablement un jour ou l'autre...

    J'ai effectivement utilisé cet exemple pour taper ceci
    Code sql : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    drop database if exists "bdd_test";
    create database "bdd_test"
    	template = "template0"
    	encoding = 'utf8';
    \connect "bdd_test"
     
    create type "complex" as (
    	"reel" smallint,
    	"img" smallint
    );
    comment on type "complex" is 'Type nombre complexe';
    create or replace function public."egal_complex"(
    	gauche "complex",
    	droite "complex"
    ) returns boolean as $$
    begin
    	return case when $1."reel" = $2."reel" and $1."img" = $2."img"
    		then true
    		else false
    	end;
    end;
    $$ language plpgsql immutable;
    create operator public.=(
    	procedure=public."egal_complex",
    	leftarg="complex",
    	rightarg="complex",
    	commutator="="
    );
     
    create table "calcul" (
    	"id_calcul" integer not null check ("id_calcul" > 0),
    	"nbr" "complex" not null,
    	primary key("id_calcul")
    ) with (oids=false);
     
    insert into calcul values(1, row(2, -2));
    select * from calcul;
    select * from calcul where nbr=row(2, -2)::complex;

    Et ça a marché. En réalité, ça m'a d'abord demandé de caster mais quand j'ai rajouté ::complex ça a été bon.

    Et justement quand j'ai rajouté le cast et que ça a fonctionné je me suis demandé si finalement le cast ne suffisait pas et j'ai alors supprimé ma fonction et mon opérateur

    Code sql : 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
    drop database if exists "bdd_test";
    create database "bdd_test"
    	template = "template0"
    	encoding = 'utf8';
    \connect "bdd_test"
     
    create type "complex" as (
    	"reel" smallint,
    	"img" smallint
    );
    comment on type "complex" is 'Type nombre complexe';
     
    create table "calcul" (
    	"id_calcul" integer not null check ("id_calcul" > 0),
    	"nbr" "complex" not null,
    	primary key("id_calcul")
    ) with (oids=false);
     
    insert into calcul values(1, row(2, -2));
    select * from calcul;
    select * from calcul where nbr=row(2, -2)::complex;
    Et ça fonctionne aussi. Est-ce une erreur de ma part qui bénéficie d'un "vide juridique" dans la bdd ou bien le cast suffit-il réellement à lui faire "deviner" ce qu'il faut faire dans ce cas précis ??? C'est en effet très simple ici de comparer les champs équivalents de deux complexes que de comparer deux fractions (l'excellent exemple que tu me proposes et où j'ai évidemment remarqué que tu étais l'auteur ) où à ce moment là il faut comparer le produit croisé des numérateurs et dénominateurs... Parce qu'en tout cas j'ai appliqué le cast sur ma vraie bdd et ça fonctionne aussi...

Discussions similaires

  1. [11g] Problème de requête sur colonne la plus récente
    Par adrien1 dans le forum SQL
    Réponses: 1
    Dernier message: 17/12/2013, 09h08
  2. Filtre sur colonne de type "name" + valeur demandée à l'écran
    Par jeanphi45 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 04/03/2010, 16h21
  3. [AC-2007] Problème requête sur 1 table en passant par une association
    Par ganon dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/08/2009, 15h33
  4. Requête sur colonne DATETIME
    Par polon dans le forum Langage
    Réponses: 4
    Dernier message: 14/04/2009, 09h54
  5. Requête sur champ de type OUI/NON
    Par bobosh dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 03/09/2008, 14h13

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