PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Général » [résolu] Order By dans un Hstore » 05/08/2014 17:15:48

En fait, dans les données, on peut voir que l'attribut "8" du HSTORE avait pour valeur une chaine de caractère vide "". C'était le problème.
J'ai modifié mon code afin que lors de l'enregistrement des données, si la valeur est nulle, le champ contiendra NULL et non une chaine vide. Grâce à cela, PostgreSQL n'a plus de problème pour caster en INT.

Merci à vous et désolé pour l'oubli.

#2 Général » [résolu] Order By dans un Hstore » 04/08/2014 12:35:21

DjangoPuccino
Réponses : 3

Bonjour à vous,

j'ai un problème lorsque je tente d'effectuer une requête select avec ORDER BY sur un champs de type hstore.
Certaines lignes ne possèdent pas tous les attributs du HSTORE, du coup lorsque je fais mon ORDER BY, si le champs n'existe pas dans le hstore, une erreur sort.

Voici la requête : (le champ hstore est "list_attributes)

ma_base => SELECT id, list_attributes FROM client_data WHERE deleted<>1 AND client_data_type_id=2 ORDER BY (list_attributes->'8')::int DESC;
ERROR:  invalid input syntax for integer: ""
ma_base => SELECT id, list_attributes FROM client_data WHERE deleted<>1 AND client_data_type_id=2;
-[ RECORD 1 ]---+-------------------------------------------------------------------------------------------------------------------------
id              | 89
list_attributes | "3"=>"MON BLOC SANS TAILLE 2", "8"=>"", "14"=>"", "16"=>NULL, "19"=>""
-[ RECORD 5 ]---+-------------------------------------------------------------------------------------------------------------------------
id              | 64
list_attributes | "3"=>"Quatrième bloc", "15"=>"1"
-[ RECORD 6 ]---+-------------------------------------------------------------------------------------------------------------------------
id              | 63
list_attributes | "3"=>"MON 3EME BLOC", "8"=>"54", "14"=>"", "15"=>"1", "16"=>NULL, "19"=>"ceci est mon 3eme bloc"

On voit notamment que la ligne 64 ne possède pas l'attribut "8". Si toutes les lignes avaient cet attribut, même pour valeur nulle, le tri fonctionnerait sans problème.
Y a t-il un moyen d'effectuer une condition afin de ne faire le order by seulement si le champ existe ou quelque chose du genre?

Merci beaucoup par avance!

#4 Général » Taille réservée en mémoire selon le type de champs » 26/05/2014 14:35:57

DjangoPuccino
Réponses : 3

Bonjour,

Je voudrais savoir comment est réservé la taille d'un champ en mémoire.
Par exemple, si ma table est définie ainsi :

                                          Table "test"
       Column        |           Type           |                           Modifiers                            
---------------------+--------------------------+----------------------------------------------------------------
 id                  | integer                  | not null default nextval('test_id_seq'::regclass)
 description         | character varying(255)   |
 long_description    | text                     |
 client_id           | integer                  | 
 parent_id           | integer                  | 
 created_date        | timestamp with time zone | not null
 last_updated_date   | timestamp with time zone | not null
 deleted             | smallint                 | not null
 list_attributes     | hstore                   | 
 association_type_id | integer                  | not null
 list_data_assoc     | hstore                   | 
 assoc_values        | hstore                   | 

Pour un varchar définie par 255 octets, pour chaque enregistrement, même si le champs description n'est pas renseigné, la taille des 255 du champ sera malgré tout réservée ? Et pour un champ Text et autres types de champs?
Y a-t-il un article ou un point de la documentation traitant de ce sujet ?
Merci par avance

#6 Général » Créer une même extension sur plusieurs schemas d'une même BDD ? » 19/05/2014 12:44:20

DjangoPuccino
Réponses : 2

Bonjour,

Je souhaiterai créer l'extension "hstore" sur plusieurs schemas d'une même base de données, est-ce possible?

Voici mon extension installée sur mon schema "dev" :

planeterh=> \dx
                           List of installed extensions
  Name   | Version |   Schema   |                   Description                    
---------+---------+------------+--------------------------------------------------
 hstore  | 1.0     | dev        | data type for storing sets of (key, value) pairs
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)

Lorsque je souhaite créer cette même extension sur un autre schema, j'ai l'erreur suivante :

planeterh=> CREATE EXTENSION hstore schema dev_julien;
ERROR:  extension "hstore" already exists

Merci beaucoup par avance pour toute aide.

#7 Re : Général » [résolu] Requête sur un champs HSTORE ( mot clé "IN" ) » 16/05/2014 12:01:05

arthurr a écrit :

Bonjour,

je souhaiterai donc pouvoir caster en string

postgres=# select 42::text;
 text 
------
 42
(1 row)

Par contre, aucune idée de savoir si le IN va fonctionner avec le Hstore

J'ai tenté ta solution et donc la requête suivante :

select list_attributes from client_data where client_data_type_id=2 and list_attributes->'10' IN (select id::text from client_data where client_data_type_id=3);
-[ RECORD 1 ]---+--------------------------------------------------------------------------------------
list_attributes | "4"=>"Science fiction", "5"=>"tout ce qui est livres de sciences fiction", "10"=>"23"
-[ RECORD 2 ]---+--------------------------------------------------------------------------------------
list_attributes | "4"=>"Combats", "5"=>"tout ce qui est jeux vidéos de combats", "10"=>"24"
-[ RECORD 3 ]---+--------------------------------------------------------------------------------------
list_attributes | "4"=>"Aventure", "5"=>"tout ce qui est jeux vidéos de aventure", "10"=>"24"
-[ RECORD 4 ]---+--------------------------------------------------------------------------------------
list_attributes | "4"=>"Romans historiques", "5"=>"tout ce qui est romans historiques", "10"=>"23"
-[ RECORD 5 ]---+--------------------------------------------------------------------------------------
list_attributes | "4"=>"Récits de voyage", "5"=>"tout ce qui est récit de voyage", "10"=>"23"

Ca fonctionne, merci beaucoup !

#8 Général » [résolu] Requête sur un champs HSTORE ( mot clé "IN" ) » 16/05/2014 11:34:25

DjangoPuccino
Réponses : 2

Bonjour à vous,

J'utilise postgresql 9.1. J'ai une table avec un client hstore, dont voici la description :

Table "dev.client_data"
       Column        |           Type           |                        Modifiers                         
---------------------+--------------------------+----------------------------------------------------------
 id                  | integer                  | not null default nextval('client_data_id_seq'::regclass)
 description         | character varying(255)   | not null
 long_description    | text                     | not null
 client_id           | integer                  | 
 parent_id           | integer                  | 
 created_date        | timestamp with time zone | not null
 last_updated_date   | timestamp with time zone | not null
 deleted             | smallint                 | not null
 list_attributes     | hstore                   | 
 form_id             | integer                  | not null
 client_data_type_id | integer                  | not null

Je souhaiterais requêter dans le hstore de la manière suivante :

planeterh=> select list_attributes from client_data where client_data_type_id=2 and list_attributes->'10' IN (select id from client_data where client_data_type_id=3);
ERROR:  operator does not exist: text = integer
LINE 1: ...e client_data_type_id=2 and list_attributes->'10' IN (select...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

Sachant que le résultat de la sous requête "select id from client_data where client_data_type_id=3" me donne comme résultat une liste de INT, je souhaiterai donc pouvoir caster en string.

Sachant que la requête suivante passe correctement :

planeterh=> select list_attributes from client_data where client_data_type_id=2 and list_attributes->'10'='23';
-[ RECORD 1 ]---+--------------------------------------------------------------------------------------
list_attributes | "4"=>"Science fiction", "5"=>"tout ce qui est livres de sciences fiction", "10"=>"23"
-[ RECORD 2 ]---+--------------------------------------------------------------------------------------
list_attributes | "4"=>"Romans historiques", "5"=>"tout ce qui est romans historiques", "10"=>"23"
-[ RECORD 3 ]---+--------------------------------------------------------------------------------------
list_attributes | "4"=>"Récits de voyage", "5"=>"tout ce qui est récit de voyage", "10"=>"23"

J'ai compris que le HSTORE attends une donnée de type string mais comment faire pour requêter sur une liste de valeurs comme avec le mot clé IN ??

Merci par avance pour votre aide.
Si vous avez des sources renseignant un peu plus que la documentation officielle sur les requetages possibles avec exemple sur hstore, je veux bien.

Merci beaucoup!

Pied de page des forums

Propulsé par FluxBB