Where permet de sélectionner des enregistrements dans une table - en association avec un ordre d'ouverture de table, de parcours de table, d'un filtre ou d'un lien.
SYNTAXE 1
... Where expr_l ...
SYNTAXE 2
... Where key id_clé [ '(' exp_ind ')' ] = liste_val ...
Elément | Description | Restrictions |
expr_l | expression_logique. portant sur : |
|
opérateurs | comparaison =, <, >, <=, >=, <> | Aucune. |
fonctions | Alphanumériques, numériques,etc... | Suivant type. |
Alphanumérique | left$, right$, mid$, seg$, len, num$, ctrans, tolower, toupper, val, ascii, chr$, instr, pat, string$, space$, mid$, vireblc. | Aucune. |
numérique | abs, int, ar2, avg, var, prd. | Aucune. |
date | aucune fonction n'est admise. | |
multi-type | find, max, min, sigma, uni. | Sauf type date. |
id_clé | nom_de_variable désignant une clé. | La clé doit exister |
exp_ind | Expression entière du nombre de parties de clé utilisées. Par défaut, toute la clé est utilisée. | Le nombre d'expressions est au plus égal au nombre de sous-clés |
liste_val | liste d'expressions séparées par le caractère ";". | Les expressions sont de même type que la sous-clé |
# Déclaration du fichier des clients facturés réduit aux seuls clients francophones.
File CLIFAC Where CODLANG = 1
# Constitution d'un fichier des noms des répertoires unix présents
# dans mon répertoire d'accueil mais ne m'appartenant pas.
File (D,L,U,G,T,M,J,A,N) From System "ls -l"-getenv$("HOME")
& As [LSL] Where P <> getenv$("LOGNAME") and left$(D,1) = "d"
# Lien des tables commandes clients et transporteurs réduit à celles
# passées à des transporteurs dont on gére le tarif.
Link COMCLI With [TAR]CODTRA = TRANSP As [LNK] Where [TAR]ATARIF = 2
# Filtre se rajoutant à la précédente sélection pour rechercher la
# prochaine commande d'un client mémorisé.
Filter [LNK] Where CODCLIF = [L]CLICUR and NUMCCL > [L]NUMCUR
# Parcours des lignes de commandes.
For [LCL]NUMLIG(1) Where NUMCCL = [CCL]NUMCCL
For [LCL]NUMLIG(2)
...
# Sélection des commandes d'un couple Client livré/Client facturé.
Filter [CCL] CLICCL(2) = toupper([M]CODCLIF);toupper([M]CODCLIL)
# clause Where avec la fonction evalue
# concaténation pour une variable multi-dimensionnée
Local Char WHER(50)(3)
WHER(0)="ABREV='Orig' "
WHER(1)="And MOT>='A'"
Local File AABREV[ABR] where evalue(WHER)
Where s'emploie associé aux instructions File, Link, Filter, For ou Choose pour restreindre les enregistrements des tables mises en oeuvre par ces instructions en se limitant à ceux répondant à la condition passée en paramètre. Ceci permettant en plus d'accélérer les instructions portant sur un ensemble d'enregistrements telles For, Delete, Update etc.
Quand une clause Where s'applique à une table (ou un ensemble de tables) sur laquelle s'appliquait déjà une clause Where, la nouvelle vient renforcer la précédente. Tout se passe comme si on faisait un "et logique" entre les deux conditions.
Exception : une instruction Filter annule la précédente instruction Filter.
La condition est évaluée au moment de la déclaration et à ce moment là seulement, y compris pour une boucle For. Dans le cas de boucles For imbriquées, il ne peut y avoir qu'une seule clause Where.
Parmi les fonctions autorisées, certaines sont transmises à la base de données et sont donc directement exploitées par celle-ci. Il s'agit des fonctions suivantes :
left$, right$, mid$, seg$, abs, toupper, tolower, len,chr$,find, ctrans, pat
Les autres fonctions ne sont pas transmises à la base de donnée. Elles sont exploitées par le moteur Adonix; Ces fonctions sont à utiliser avec précaution, car il pourra y avoir des problèmes de performance.
Il ne faut pas utiliser les variables de la table en indice d'une variable dimensionnée sur laquelle porterait la sélection. Même si la syntaxe est acceptée.
Exemple :
Filter [CCL] Where [L]CATEG([F:CCL]TYPCOM) = 1
# donne une erreur à l'exécution.
Clause Where et constantes
si un critère de la clause Where contient un test de constante faux, cela signifie qu'on n'appliquera aucun des critères. Dans l'exemple, tout le fichier est lu.
Filter [ITM] Where 1=0 & [F:ITM]ITMREF="CD100"
Clause Where et champ d'une autre table
si un critère de la clause Where contient un champ d'une autre table, cela signifie qu'on n'appliquera aucun des critères. Dans l'exemple, tout le fichier est lu.
Filter [ITM] Where[F:ITV]ITMREF="CD100" & [F:ITM]ITMREF="CD100"
Clause Where et fonction pat()
La fonction pat() n'est transmise à la base de donnée que si elle est employée comme fonction numérique et non logique :
- formule déconseillée ( car non transmise à la base et donc moins performante )
Filter [F] Wherepat(x,"A*")
- formule recommandée
Filter [F] Where pat(x,"A*")<>0
Clause Where et fonction non suportée
Certaines fonctions ne sont pas supportées dans la clause where. Il s'agit des fonctions suivantes :
- sigma
Clause Where et fonction ayant pour paramètre des fonctions dont le résultat n'est pas une constante.
ex: find(...num$([F:STJ]ENTCOD)...))
Quand on rencontre ce genre d'expression, la deuxième fonction est considérée comme constante et évaluée qu'une seule et unique fois.