Vous appréciez mon travail ?
Je serais ravi de prendre un café !

Vous prenez du plaisir à lire mes articles ? Vous apprenez de nouvelles choses ? Je serais ravis que vous supportiez mon travail avec une petite participation

1 café Merci, vous financez ma dose quotidienne de théïne (oui, en vrai je ne bois pas de café).
5 cafés Génial, ça couvre mes frais de serveur mensuels.
10 cafés Fantastique, avec ça je peux investir dans du matériel et approfondir mes connaissances.
BazinGa's - Tips & tuto IT

Formater ses requêtes dynamiques avec format()

Lorsque vous faites de PL/pgSQL, il est courant de générer une requête de façon dynamique pour l’exécuter par la suite. Pour faire cela, la fonction format() vous permet de définir un modèle qui sera ensuite complété par la valeur d’une ou plusieurs variables.

Voici comment l’utiliser.

Syntaxe de base

La fonction suit la syntaxe suivante : format('modele', 'variable1', 'variable2')

  • modele est donc la chaine de texte à formater
  • variables1 et variable2 sont les valeurs à inclure dans le modèle

Le retour est une chaine de texte basée sur le modèle et les valeurs des variables.

Voici un exemple d’utilisation : SELECT format('SELECT %1$I FROM %2$I.%3$I', 'ma_colonne', 'mon_schema', 'Ma_Table')

Qui renvoi le texte : SELECT ma_colonne FROM mon_schema."Ma_Table"

Modèle et emplacement

Le modèle est une chaine de texte contenant des emplacements.

Les emplacements utilisent la syntaxe suivante : %[position][flags][width]type

  • % : obligatoire, permet d’indiquer le début de l’emplacement. Pour utiliser le caractère « % » sans spécifier d’emplacement, doublez le : %%
  • position : facultatif, permet d’indiquer le paramètre à utiliser (de 1 à n) sous la forme n$. À défaut, l’ordre d’apparition de l’emplacement détermine le numéro du paramètre utilisé.
  • flags : facultatif, à utiliser uniquement avec width, permet de justifier le texte à droite en indiquant le signe « -« .
  • width : facultatif, indique la longueur de la valeur à retourner via un chiffre entier positif. Il est possible d’utiliser *n$ pour indiquer le numéro de l’argument (en remplaçant le « n ») contenant la longueur à utiliser.
  • type : obligatoire, permet d’indiquer si la valeur doit être traitée spécifiquement :
    • s utiliser la valeur telle qu’elle. La valeur NULL est remplacée par une chaine vide.
    • I utiliser la valeur comme un identifiant SQL : ajoute des guillemets autour de la valeur si un caractère spécial apparait.
    • L utiliser la valeur comme un littéral SQL : ajoute un apostrophe avant et après la valeur et double les apostrophes contenus.

Exemples

Voici une requête illustrant le fonctionnement de la fonction format().

SELECT 
  format(modele, arg1, arg2, arg3),
  modele,
  arg1,
  arg2,
  arg3
FROM (VALUES 
  ('Valeur 1 : %1$s - valeur 2 : %2$s - valeur 3 : %3$s', 'ma valeur', NULL, NULL),
  ('Mon texte : %1$s', 'ma valeur', NULL, NULL),
  ('Mon texte : %1$I', 'ma valeur', NULL, NULL),
  ('Mon texte : %1$L', 'ma valeur', NULL, NULL),
  ('SELECT %1$I FROM %2$I.%3$I', 'ma_colonne', 'mon_schema', 'Ma_Table'),
  ('|%1$20s|', 'mon texte', NULL, NULL),
  ('|%1$-20s|', 'mon texte', NULL, NULL)
) AS t(modele, arg1, arg2, arg3)

Qui renvoi les données suivantes :

formatmodelearg1arg2arg3
Valeur 1 : ma valeur – valeur 2 : – valeur 3 :Valeur 1 : %1$s – valeur 2 : %2$s – valeur 3 : %3$sma valeur[NULL][NULL] 
Mon texte : ma valeurMon texte : %1$sma valeur[NULL][NULL] 
Mon texte : « ma valeur »Mon texte : %1$Ima valeur[NULL][NULL] 
Mon texte : ‘ma valeur’Mon texte : %1$Lma valeur[NULL] [NULL] 
SELECT ma_colonne FROM mon_schema. »Ma_Table »SELECT %1$I FROM %2$I.%3$Ima_colonnemon_schemaMa_Table
| mon texte||%1$20s|mon texte[NULL] [NULL]
|mon texte ||%1$-20s|mon texte[NULL] [NULL] 

Cet article vous a plu ?

N'hésitez pas à le partager, il interessera surement certains de vos contacts.

Les thèmes suivants contiennent des articles en lien avec celui-ci, allez faire un tour :

BDDPostgreSQLSQL formatageplpgsqlrequete dynamique

50%