Cette page a été traduite de l'anglais avec l'aide de l'IA. En cas de divergence, la version anglaise fait référence.
IDENTIFIER
Résout une chaîne de caractères, en général une variable de session, en nom de colonne. Utilisez cette fonction là où $variable seul serait sinon lu comme une valeur scalaire. Disponible à partir de StackQL v1.0.
Voir aussi :
[SET] [ Variables de session ]
Syntaxe
SELECT IDENTIFIER($variable) FROM <multipartIdentifier> ORDER BY IDENTIFIER($variable);
Arguments
variable
Une variable de session, ou un littéral de chaîne, contenant un nom de colonne. Un nom qualifié tel que t.name est accepté. Un seul argument est accepté et il doit s'agir d'une seule valeur de type chaîne ; une concaténation telle que 't.' || $column_name, un second argument ou une valeur numérique est rejeté avec IDENTIFIER requires one string value. Une valeur vide, ou une valeur contenant une instruction, est rejetée avec invalid identifier value, et une variable non définie échoue comme non définie. Toutes ces vérifications ont lieu avant tout appel d'API au provider.
Valeur(s) renvoyée(s)
La fonction est remplacée, dans l'instruction analysée, par une référence à la colonne nommée ; elle renvoie donc la valeur de cette colonne. Les noms sont convertis en identifiants et ne sont jamais insérés dans le texte SQL. La référence de colonne obtenue peut être utilisée partout où une colonne peut l'être : la liste de sélection, les clauses WHERE, GROUP BY et ORDER BY, les arguments de fonction, ainsi que dans les CTE et les sous-requêtes.
Exemples
Projeter et trier selon une colonne nommée dans une variable
La colonne à renvoyer et la colonne de tri proviennent toutes deux de column_name, et la colonne de sortie est renommée à partir de output_name. IDENTIFIER est nécessaire dans la liste de sélection et dans ORDER BY, car $column_name seul à ces positions serait la chaîne 'name', et non la colonne. L'alias utilise à la place la forme entre guillemets doubles. Une fois les variables résolues, l'instruction est identique à SELECT name AS bucket FROM aws.s3.buckets WHERE region = 'ap-southeast-2' ORDER BY name.
SET column_name = 'name';
SET output_name = 'bucket';
SELECT IDENTIFIER($column_name) AS "$output_name"
FROM aws.s3.buckets
WHERE region = 'ap-southeast-2'
ORDER BY IDENTIFIER($column_name);
Filtrer sur une colonne nommée dans une variable
La référence résolue fonctionne aussi bien dans un prédicat que dans une projection. Ici, le champ sur lequel filtrer et la valeur à rechercher proviennent tous deux de variables : IDENTIFIER($filter_column) devient la colonne status, tandis que $filter_value est transmis comme le littéral de chaîne 'RUNNING'. Les deux formes sont délibérément différentes, car la première nomme une colonne et la seconde fournit une valeur.
SET filter_column = 'status';
SET filter_value = 'RUNNING';
SELECT name, zone
FROM google.compute.instances
WHERE project = 'stackql-demo'
AND zone = 'australia-southeast1-a'
AND IDENTIFIER($filter_column) = $filter_value;
Qualifier la colonne avec un alias de table
Une valeur contenant un point est résolue en référence de colonne qualifiée. La table reçoit l'alias w, l'alias lui-même étant tiré d'une variable, et IDENTIFIER($column_name) devient w.name. C'est la forme à utiliser lorsque le même nom de colonne existe des deux côtés d'une jointure et que la référence serait sinon ambiguë.
SET table_alias = 'w';
SET column_name = 'w.name';
SELECT IDENTIFIER($column_name) AS bucket
FROM aws.s3.buckets AS "$table_alias"
WHERE w.region = 'ap-southeast-2';
Valeurs rejetées
Comme la valeur devient un nom et non du texte de requête, tout ce qui n'est pas un nom utilisable est refusé avant que l'instruction soit planifiée, et aucun appel d'API n'atteint le provider. Les deux premières instructions ci-dessous échouent avec invalid identifier value et la troisième avec IDENTIFIER requires one string value.
/*
SET column_name = '';
SELECT IDENTIFIER($column_name) FROM aws.s3.buckets;
-- FAILS with invalid identifier value
SET column_name = 'name; DROP TABLE imaginary';
SELECT IDENTIFIER($column_name) FROM aws.s3.buckets;
-- FAILS with invalid identifier value
SET column_name = 17;
SELECT IDENTIFIER($column_name) FROM aws.s3.buckets;
-- FAILS with IDENTIFIER requires one string value
*/
Dans une clause
FROM,$variableest résolu en relation sansIDENTIFIER, et la forme entre guillemets doubles"$variable"est utilisée pour les alias, les noms de colonnes DDL, les listes de colonnesINSERTet les ciblesUPDATE.