Fonctionnalités SQL dans GRASS GIS. Cet article est la traduction de la page originale du manuel utilisateur de GRASS 6 (en anglais), consacrée aux fonctionnalités SQL incorporées dans le noyau de GRASS.
Si vous n'utilisez que le pilote dbf fourni par défaut, vous n'aurez à votre disposition qu'un nombre limité de fonctions et d'opérateurs SQL. En associant GRASS à un SGBD, vous disposerez alors de fonctionnalités complètes sur vos tables attributaires.
FONCTIONS
ALTER TABLE table ADD [COLUMN] defchamps CREATE TABLE table ( defschamps ) DROP TABLE table SELECT champs FROM table SELECT champs FROM table WHERE condition DELETE FROM table DELETE FROM table WHERE condition INSERT INTO table VALUES (valeur1[,valeur2,...]) INSERT INTO table ( champs1[,champs2,...] ) VALUES (valeur1[,valeur2,...]) UPDATE table SET assignation1[,assignation2,...] UPDATE table SET assignation1[,assignation2,...] WHERE condition
OPERATEURS
"=" : égal à "<" : inférieur à "<=" : inférieur ou égal à ">" : supérieur à ">=" : supérieur ou égal à "<>" : différent de "~" : sous-chaîne identique à
Des expressions arithmétiques utilisant des constantes et des valeurs de champs sont permises dans les clauses conditionnelles ainsi que dans les clauses d'assignation. Les règles classiques de priorités et les parenthèses (en utilisant les symboles '(' et ')') sont gérées. La conversion de type est possible si vous le désirez (cette fonctionnalité est encore à l'état expérimental).
Les fonctions agrégées (sum, count, min, max,...) ne sont pour l'instant pas gérées dans les clauses SELECT.
Les fonctions mathématiques (sin, cos, exp, log,...) ne sont pour l'instant pas possibles dans les expressions.
Les clauses conditionnelles permettent d'utiliser des expressions booléennes en vous servant des opérateurs AND, OR et NOT, avec la règle de priorité classique entre ces expressions.
Vous pouvez connaître les valeurs nulles (NULLs) grâce à la condition 'colname IS NULL'. Sa réciproque s'énonce 'colname NOT NULL'.
NOTES
-
SQL ne tolère pas les '.' (points) dans les noms de table.
-
Les caractères valides pour les noms de tables sont exclusivement :
[A-Za-z][A-Za-z0-9_]*
-
Un nom de table doit commencer par une lettre et non un chiffre.
-
La recherche de chaînes de caractère à besoin que la partie de texte soit encadrée par des guillemets simples tandis que les recherches multiples seront encadrées par des doubles guillemets. Par exemple,
d.vect map where="individual='juvenile' and area='beach'"
-
Un message d'erreur du type "dbmi: Protocol error" vous alerte soit sur un nom de champ invalide ou sur un type de champ non géré (le parser SQL GRASS a besoin d'être renforcé).
-
Les noms de champ en DBF sont limités à 10 caractères (définition DBF API)
EXEMPLES
Affichage de tous les points vectoriels à l'exception de la vallée de LAMAR et des zones d'extensive trapping (dans cet exemple, les parenthèses ne sont pas indispensables) :
d.vect trapping_sites_points fcol=black icon=basic/diamond col=white size=13 \ where="valley <> 'LAMAR' OR (valley = 'LAMAR' AND description = 'extensive trapping')"
Sélectionne tous les attributs de la table où les valeurs du champ str1 sont différentes de 'No Name' :
echo "SELECT * FROM archsites WHERE str1 <> 'No Name'" | db.select
Exemple de manipulation des valeurs nulles :
v.db.addcol map=roads col="nulltest int" v.db.update map=roads col=nulltest value=1 where="cat >2" d.vect roads where="nulltest is null" v.db.update map=roads col=nulltest value=2 where="cat <=2"
Exemples d'expressions complexes dans des clauses de mise à jour (en utilisant des modules v.db.*) :
v.db.addcol map=roads col="exprtest double" v.db.update map=roads col=exprtest value=cat/nulltest v.db.update map=roads col=exprtest value=cat/nulltest+cat where=cat=1
Exemples d'expressions complexes dans des clauses de mise à jour (en utilisant des modules db.*):
echo "UPDATE roads SET exprtest=null" echo "UPDATE roads SET exprtest=cat/2" | db.execute echo "UPDATE roads SET exprtest=cat/2+cat/3" | db.execute echo "UPDATE roads SET exprtest=NULL WHERE cat>2" | db.execute echo "UPDATE roads SET exprtest=cat/3*(cat+1) WHERE exprtest IS NULL" | db.execute"
En pratique, vous n'avez pas besoin de créer/mettre à jour des champs à l'aide d'expressions, mais vous pouvez vous en servir directement dans d'autres commandes :
d.vect roads where="(cat/3*(cat+1))>8" d.vect roads where="cat>exprtest"
Site officiel : GRASS GIS