Limiter le nombre de postes de tableaux parcouru avec JSON_TABLE
Tout a commencé par des données renvoyées par un web service, avec une mauvaise gestion du tableau JSON contenu dans la réponse : 1.000 éléments retournés systématiquement, mais seulement un petit nombre utilisés. Les autres postes de tableau portent des valeurs par défaut. De plus, un élément JSON indique le nombre de postes utiles.
L’enjeu est donc le limiter les informations renvoyées par JSON_TABLE aux seules informations utiles.
Nous avons reproduis un jeu de test pour simplifier et expliquer le sujet, voici les données :

Le code SQL permettant d’appeler notre service et mémoriser les données résultat dans une variable :

Cela produit le résultat :

Débarrassons nous des lignes inutiles !
Pour aller vite
Notre premier reflexe, pour pouvoir continuer le reste du code : sélectionner les enregistrements avec un code > 0.

Cela fonctionne n’est ce n’est pas parfait : on réalise d’abord le parcours de l’ensemble du tableau JSON et ensuite seulement on teste la valeur de l’identifiant pour exclure la ligne du résultat.
D’un point de vue performance ce n’est pas très satisfaisant.
Et si l’on généralise, il faut être certain que l’id zéro n’existe pas, trouver une sélection qui fonctionne dans tous les cas.
Dommage quand on sait déjà le nombre d’éléments dans la liste !
Utilisation de LIMIT
Pour améliorer, utilisons LIMIT :

Mais la syntaxe n’est pas supportée :
[SQ20467] L’expression contenant NB doit calculer une valeur constante., 428H7, -20467
Il faut alors passer par une variable :

C’est un peu mieux (pas de test sur chaque ligne), mais pas génial puisque l’on limite le nombre de lignes toujours après avoir extrait l’ensemble du tableau.
JSON_TABLE et ORDINALITY
JSON_TABLE dispose d’une possibilité de numéroter les lignes résultats : cela rend la sélection des lignes indépendante du contenu, ce qui est bien !

Mais là encore, nous limitons les valeurs de retour après l’extraction.
JSON_TABLE avec [..]
JSON_TABLE permet d’indiquer l’intervalle de tableau à traiter (en partant de 0) :

Mais il est impossible d’indiquer une variable ou une valeur issue de l’extraction elle-même comme ceci :
NESTED PATH ‘lax $.producteurs[0 to p.nb]’
NESTED PATH ‘lax $.producteurs[0 to nb.max_rows]’
SQL dynamique
Seule solution que nous ayons trouvé pour traiter ces cas !
Cela permet de générer l’instruction avec
NESTED PATH ‘lax $.producteurs[0 to 28]’
Evidemment à réserver aux cas critiques !

