Maison > base de données > tutoriel mysql > Pourquoi les colonnes renvoyées par ma fonction sont-elles concaténées dans ma requête PostgreSQL ?

Pourquoi les colonnes renvoyées par ma fonction sont-elles concaténées dans ma requête PostgreSQL ?

Susan Sarandon
Libérer: 2024-12-26 13:27:11
original
775 Les gens l'ont consulté

Why Are My Function's Returned Columns Concatenated in My PostgreSQL Query?

L'enregistrement renvoyé par une fonction affiche des colonnes concaténées : démêler la cause

Dans une requête, joindre des tables et récupérer des données historiques à partir d'une fonction, les utilisateurs peut rencontrer un problème où les colonnes renvoyées par la fonction apparaissent concaténées en une seule chaîne. Cette anomalie se produit lors de l'utilisation de la fonction directement dans la requête principale.

Comprendre le problème

Lors de l'interrogation d'une fonction qui renvoie plusieurs colonnes, telle que :

account_servicetier_for_day(acct.accountid, '2014-08-12')
Copier après la connexion

il renvoie un enregistrement contenant les données demandées. Cependant, lorsque cet enregistrement est intégré dans une autre requête, PostgreSQL l'interprète comme une seule chaîne concaténée.

Décomposition de la sortie de la fonction

Pour remédier à cela, les utilisateurs doivent extraire l'individu colonnes de l'enregistrement de la fonction. Dans les versions 9.3 et ultérieures de PostgreSQL, cela peut être réalisé en utilisant la syntaxe JOIN LATERAL, qui permet une intégration transparente des fonctions dans la clause FROM :

JOIN LATERAL account_servicetier_for_day(a.accountid, '2014-08-12') f ON TRUE
Copier après la connexion

La clause ON TRUE garantit que toutes les lignes de gauche Les tables sont jointes au résultat de la fonction, quel que soit le nombre de lignes renvoyées.

Dans PostgreSQL 9.2 et versions antérieures, l'extraction des données de colonne nécessite un sous-requête explicite :

(SELECT *, account_servicetier_for_day(a.accountid, '2014-08-12') AS rec
   FROM account_tab a) AS a
Copier après la connexion

Ici, la sous-requête attribue le résultat de l'appel de fonction à un enregistrement nommé rec. La requête externe peut alors faire référence aux colonnes de l'enregistrement, comme a.rec.timestamp.

Éviter Not In (Sous-requête)

Enfin, il est recommandé d'éviter d'utiliser NOT IN (sous-requête) pour l'exclusion définie. Préférez plutôt la clause NOT EXISTS, plus efficace et moins sujette aux problèmes de performances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal