PostgreSQLLa base de données la plus sophistiquée au monde.

F.10. hstore

Ce module code le type de données hstore pour stocker des ensembles de paires (clé, valeur) à l'intérieur d'un simple champ PostgreSQL™. Cela peut s'avérer utile dans divers cas, comme les lignes à attributs multiples rarement examinées ou les données semi-structurées.

Dans l'implantation actuelle, ni la clé ni la valeur ne peuvent avoir une taille supérieure à 65535 octets ; une erreur sera renvoyée si cette limite est dépassée. Ces longueurs maximum pourraient évoluer dans les prochaines versions.

F.10.1. Représentation externe de hstore

La représentation textuelle d'une valeur hstore inclut zéro ou plusieurs paires clé => valeur séparées par des virgules. Par exemple :

    k => v
    foo => bar, baz => whatever
    "1-a" => "anything at all"
   

L'ordre des éléments n'est pas significatif (et peut ne pas être reproduit en sortie). Les espaces entre les éléments ou autour du signe => sont ignorées. Des guillemets doubles sont nécessaires si une clé ou une valeur inclut espace, virgule, = ou >. Pour inclure un guillemet double ou un antislash dans une clé ou une valeur, on le précède d'un autre antislash. (En fonction de la configuration de standard_conforming_strings, il peut s'avérer nécessaire de doubler les antislashs dans les chaînes litérales SQL.)

Une valeur (mais pas une clé) peut être NULL. Ceci est représenté ainsi :

    key => NULL
   

Le mot clé NULL est insensible à la casse. Là aussi, on utilise les guillemets doubles pour que la chaîne null soit traitée comme une valeur ordinaire.

Actuellement, les guillemets doubles sont utilisés pour entourer les chaînes représentant la clé et la valeur en sortie, même si ce n'est pas strictement nécessaire.

F.10.2. Opérateurs et fonctions hstore

Tableau F.5. Opérateurshstore

Opérateur Description Exemple Résultat
hstore -> text obtenir la valeur de la clé (NULL si inexistante) 'a=>x, b=>y'::hstore -> 'a' x
text => text créer un hstore à un seul élément 'a' => 'b' "a"=>"b"
hstore || hstore concaténation 'a=>b, c=>d'::hstore || 'c=>x, d=>q'::hstore "a"=>"b", "c"=>"x", "d"=>"q"
hstore ? text hstore contient-il une clé donnée ? 'a=>1'::hstore ? 'a' t
hstore @> hstore l'opérande gauche contient-il l'opérande droit ? 'a=>b, b=>1, c=>NULL'::hstore @> 'b=>1' t
hstore <@ hstore l'opérande gauche est-il contenu dans l'opérande droit ? 'a=>c'::hstore <@ 'a=>b, b=>1, c=>NULL' f

Avant PostgreSQL 8.2, les opérateurs de contenance @> et <@ étaient appelés respectivement @ et ~. Ces noms sont toujours disponibles mais sont devenus obsolètes et pourraient éventuellement être supprimés. Les anciens noms sont inversés par rapport à la convention suivie par les types de données géométriques.

[Note]

Note

L'opérateur => est obsolète et pourrait être supprimé dans une prochaine version. Utilisez à la place la fonction hstore(text, text).

Tableau F.6. Fonctions hstore

Fonction Type en retour Description Exemple Résultat
hstore(text, text) hstore créer un hstore à un seul élément hstore('a', 'b') "a"=>"b"
akeys(hstore) text[] récupérer les clés du hstore dans un tableau akeys('a=>1,b=>2') {a,b}
skeys(hstore) setof text récupérer les clés du hstore dans un ensemble skeys('a=>1,b=>2')
a
b
avals(hstore) text[] récupérer les valeurs du hstore dans un tableau avals('a=>1,b=>2') {1,2}
svals(hstore) setof text récupérer les valeurs du hstore dans un ensemble svals('a=>1,b=>2')
1
2
each(hstore) setof (key text, value text) récupérer les clés et valeurs du hstore dans un ensemble select * from each('a=>1,b=>2')
 key | value
-----+-------
 a   | 1
 b   | 2
exist(hstore,text) boolean le hstore contient-il une clé donnée ? exist('a=>1','a') t
defined(hstore,text) boolean le hstore contient-il une valeur non NULL pour la clé ? defined('a=>NULL','a') f
delete(hstore,text) hstore supprimer tout élément correspondant à une clé donnée delete('a=>1,b=>2','b') "a"=>"1"

F.10.3. Index

hstore supporte des index pour les opérateurs @> et ?. Les types d'index GiST et GIN peuvent être utilisés. Par exemple :

CREATE INDEX hidx ON testhstore USING GIST(h);

CREATE INDEX hidx ON testhstore USING GIN(h);
  

F.10.4. Exemples

Ajouter une clé, ou mettre à jour une clé existante avec une nouvelle valeur :

UPDATE tab SET h = h || ('c' => '3');
  

Supprimer une clé :

UPDATE tab SET h = delete(h, 'k1');
  

F.10.5. Statistiques

Le type hstore, du fait de sa libéralité intrinsèque, peut contenir beaucoup de clés différentes. C'est à l'application de vérifier la validité des clés. Les exemples ci-dessous présentent plusieurs techniques pour vérifier les clés et obtenir des statistiques.

Exemple simple :

SELECT * FROM each('aaa=>bq, b=>NULL, ""=>1');
  

En utilisant une table :

SELECT (each(h)).key, (each(h)).value INTO stat FROM testhstore;
  

Statistiques en ligne :

SELECT key, count(*) FROM
  (SELECT (each(h)).key FROM testhstore) AS stat
  GROUP BY key
  ORDER BY count DESC, key;
    key    | count
-----------+-------
 line      |   883
 query     |   207
 pos       |   203
 node      |   202
 space     |   197
 status    |   195
 public    |   194
 title     |   190
 org       |   189
...................
  

F.10.6. Auteurs

Oleg Bartunov , Moscou, Université de Moscou, Russie

Teodor Sigaev , Moscou, Delta-Soft Ltd., Russie