Maison >base de données >tutoriel mysql >Pourquoi les colonnes renvoyées par ma fonction PostgreSQL sont-elles concaténées et comment puis-je y remédier ?

Pourquoi les colonnes renvoyées par ma fonction PostgreSQL sont-elles concaténées et comment puis-je y remédier ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-27 01:38:14357parcourir

Why Are My PostgreSQL Function's Returned Columns Concatenated, and How Can I Fix It?

L'enregistrement renvoyé par une fonction comporte des colonnes concaténées

Lors de l'utilisation d'une fonction pour récupérer des données dans un but spécifique, il peut arriver que le retour les colonnes de l'enregistrement sont concaténées en une seule colonne. Cela peut se produire lorsque la fonction est utilisée comme sous-requête dans une autre requête.

Comprendre les résultats de la fonction

Pour décomposer la ligne renvoyée par la fonction et obtenir les colonnes individuelles, exécutez simplement la fonction séparément :

SELECT * FROM account_servicetier_for_day(20424, '2014-08-12');

Cela fournira une sortie avec la colonne attendue structure.

Résolution de la requête d'origine

Pour résoudre le problème avec la requête d'origine, il existe plusieurs approches selon la version de PostgreSQL utilisée :

PostgreSQL 9.3 ou version ultérieure

Utilisez JOIN LATERAL pour connectez la sous-requête et conservez la structure des lignes :

SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes
     , a.username, a.accountid, a.userid
     , f.*   -- but avoid duplicate column names!
FROM   account_tab a
     , account_servicetier_for_day(a.accountid, '2014-08-12') f  -- <-- HERE
WHERE  a.isdsl = 1
AND    a.dslservicetypeid IS NOT NULL
AND    NOT EXISTS (
   SELECT FROM dailyaccounting_tab
   WHERE  day = '2014-08-12'
   AND    accountid = a.accountid
   )
ORDER  BY a.username;

PostgreSQL 9.2 ou version antérieure

Utilisez une sous-requête pour appeler la fonction et décomposer la ligne dans la requête externe :

SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes
     , a.username, a.accountid, a.userid
     , (a.rec).*   -- but be wary of duplicate column names!
FROM  (
   SELECT *, account_servicetier_for_day(a.accountid, '2014-08-12') AS rec
   FROM   account_tab a
   WHERE  a.isdsl = 1
   AND    a.dslservicetypeid Is Not Null
   AND    NOT EXISTS (
       SELECT FROM dailyaccounting_tab
       WHERE  day = '2014-08-12'
       AND    accountid = a.accountid
      )
   ) a
ORDER  BY a.username;

Dans les deux cas, faites attention aux noms de colonnes en double potentiels lors de la sélection des éléments décomposés. rangée.

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:
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