SQL EMBEDDED - Utiliser WHERE EXISTS plutôt que COUNT(*) pour tester la présence d'enregistrements dans une table
Bonne pratique :
SELECT COUNT(*) FROM est un requête très utile pour déterminer le nombre d’enregistrements présents dans une table, ou répondant aux critères de sélections utilisés dans une clause WHERE.
Mais il arrive que le SELECT COUNT(*) soit également utilisé pour déterminer si une table contient des enregistrements, ou si une sélection retourne des enregistrements.
Dans ce cas : il est préférable d’utiliser la clause WHERE EXISTS plutôt que le SELECT COUNT(*).
En effet SELECT COUNT(*) induit la lecture de toutes les lignes répondant aux critères de sélection alors que le WHERE EXISTS s’arrétera au premier enregistrement répondant à la sélection.
L’utilisation du WHERE EXISTS est donc souvent plus performante en terme de temps de traitement que le SELECT COUNT(*) lorsqu’il s’agit de déterminer si au moins un enregistrements est présent dans une table ou répond aux critères de sélection d’une clause WHERE.
Syntaxe :
Exemple 1: Tester si au moins un enregistrement est présent dans la table ma_bibliotheque.ma_table
Dcl-s ma_variable_resultat CHAR(1) inz(‘N‘);
EXEC SQL
SELECT ‘O‘
INTO :ma_variable_resultat
FROM SYSIBM.SYSDUMMY1
WHERE EXISTS(
SELECT mon_champ
FROM ma_bibliotheque.ma_table);
// test si au moins 1 enregistrement est présent dans ma_bibliotheque.ma_table
IF ma_variable_resultat = ‘O‘;
// Au moins 1 enregistrement est présent dans la table
endif;
Exemple 2: Tester si au moins un enregistrement est répond aux critères de sélection
Dcl-s ma_variable_resultat CHAR(1) inz(‘N‘);
EXEC SQL
SELECT ‘O‘
INTO :ma_variable_resultat
FROM SYSIBM.SYSDUMMY1
WHERE EXISTS(
SELECT mon_champ
FROM ma_bibliotheque.ma_table
WHERE nom_champ = :ma_variable_rpg);
// test si au moins 1 enregistrement répond à la sélection mon_champ = :ma_variable_rpg dans ma_bibliotheque.ma_table
IF ma_variable_resultat = ‘O‘;
// au moins 1 enregistrement répond à la séléection
endif;
Exemple 3: WHERE EXISTE dans une requête SQL dynamique
Attention : Dans une requête SQL dynamique si aucun résultat n’est retourné, la clause WHERE EXISTS lève une erreur (SQLCODE -305).
Pour palier à cela, il suffit d’encapsuler le WHERE EXISTS dans un CASE.
Exemple : Tester si une bibliothèque ( = variable dynamique) existe
Dcl-s G_EXISTE CHAR(1) inz;
Dcl-s G_REQUETE CHAR(500) inz;
Dcl-s ma_bibliotheque CHAR(10) inz;
// Initialisation de la bibliotèque pour laquelle on souhaite tester l’existence
ma_bibliotheque = ‘maBib’;
G_EXISTE = ‘N’;
G_REQUETE = ‘VALUES(‘
+ ‘CASE(SELECT »O » FROM SYSIBM.SYSDUMMY1 WHERE EXISTS(‘
+ ‘SELECT OBJECT_COUNT FROM TABLE(QSYS2.LIBRARY_INFO( »’
+ %TRIM(ma_bibliotheque)
+ »’)))) WHEN »O » THEN »O » ELSE »N » END) INTO ?’;
EXEC SQL
PREPARE SQLSTM FROM :G_REQUETE;
IF SQLCODE = 0;
EXEC SQL
EXECUTE SQLSTM USING :G_EXISTE;
Endif;
// test si la bibliothèque cherchée existe
If G_EXISTE <> ‘O’;
// La bibliothèque cherchée existe
Endif;
Remarque :
Pour savoir si une table existe ou non, il faut directement requêter QSYS2.OBJECT_STATISTICS ou QSYS2.SYSTABLES.
Exemples pour savoir si la table ma_table existe dans la biliothèque ma_bibliotheque :
Dcl-s ma_variable_resultatCHAR(1) inz(‘N‘);
SELECT ‘O’
INTO :ma_variable_resultat
FROM SYSIBM.SYSDUMMY1
WHERE EXISTS(
SELECT SYSTEM_TABLE_NAME
FROM QSYS2.SYSFILES
WHERE SYSTEM_TABLE_SCHEMA = ‘ma_biliotheque’
AND SYSTEM_TABLE_NAME = ‘ma_table’);
// test si la table ma_table existe dans la bibliothèque ma_bibliotheque
IF ma_variable_resultat = ‘O‘;
// La table ma_table existe dans la bibliothéque ma_bibliotheque
endif;
// OU
Dcl-s ma_variable_resultatCHAR(1) inz(‘N‘);
SELECT ‘O’
INTO :ma_variable_resultat
FROM SYSIBM.SYSDUMMY1
WHERE EXISTS(SELECT OBJNAME FROM TABLE(QSYS2.OBJECT_STATISTICS(‘ma_bibliotheque’, ‘*FILE’, ‘ma_table’)));
// test si la table ma_table existe dans la bibliothèque ma_bibliotheque
IF ma_variable_resultat = ‘O‘;
// La table ma_table existe dans la bibliothéque ma_bibliotheque
endif;
Conclusion :
Il faut utiliser :
- SELECT COUNT(*)
Lorsque l’on souhaite connaitre le nombre d’enregistrements présents dans une table ou répondant à une sélection. - WHERE EXISTS
Lorsque que l’on souhaite savoir si une table contient au moins un enregistrement ou si une clause WHERE retourne au moins un enregistrement