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.
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.
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.
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" |
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);
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');
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 ...................
Oleg Bartunov <oleg@sai.msu.su>, Moscou, Université de Moscou, Russie
Teodor Sigaev <teodor@sigaev.ru>, Moscou, Delta-Soft Ltd., Russie