7
votes

Comment diviser un type en plusieurs colonnes dans Postgres?

J'ai le code suivant pour renvoyer plusieurs valeurs de PL / Python:

column, column2
egg, 4


0 commentaires

4 Réponses :


8
votes

Ouais, la syntaxe pour cela est un peu loufaie, nécessitant des parenthèses supplémentaires: xxx

pour obtenir plusieurs composants de la sortie tout en invoquant uniquement la fonction une fois, vous pouvez utiliser une sous-sélection. : xxx


4 commentaires

Votre code fonctionne, mais ai-je vraiment besoin d'une sous-sélection pour faire cela? J'étais tellement proche de make_pair ('Egg', 4) Nom, mais cela n'a pas fonctionné.


Vous pouvez dire SELECT (Make_Pair ('Egg', 4)). Nom , par exemple. Si vous souhaitez les deux composants mais seulement pour exécuter la fonction une fois, je pense que vous avez besoin de la sous-sélection. Je vais mettre à jour la réponse.


Ne pas avoir à exécuter la fonction plus d'une fois est définitivement un objectif.


J'ai ajouté ma propre réponse avec du code de travail pour éviter de devoir exécuter la fonction deux fois et, en même temps, éviter une sous-requête. Je vais toujours accepter votre réponse lorsque vous me le conduisez.



1
votes

Ce qui suit est le code de travail pour éviter de devoir exécuter la fonction deux fois et, en même temps, évitez une sous-requête.

CREATE TYPE named_value AS (
  name   text,
  value  integer
);

CREATE or replace FUNCTION setcustomvariable(variablename text, variablevalue named_value)
  RETURNS named_value
AS $$
  GD[variablename] = variablevalue
  return variablevalue
$$ LANGUAGE plpythonu;

CREATE or replace FUNCTION getcustomvariable(variablename text)
  RETURNS named_value
AS $$
  return GD[variablename]
$$ LANGUAGE plpythonu;

CREATE or replace FUNCTION make_pair (name text, value integer)
  RETURNS named_value
AS $$
  return [ name, value ]
$$ LANGUAGE plpythonu;

select setcustomvariable('result', make_pair('egg', 4)), (getcustomvariable('result')).name, (getcustomvariable('result')).value


0 commentaires

3
votes
 SELECT name, value FROM make_pair('egg', 4) AS x;


 SELECT a, b FROM make_pair('egg', 4) AS x(a,b);

1 commentaires

C'est une solution très élégante, mais je ne sais pas comment l'utiliser dans mon cas où j'ai besoin d'exécuter la fonction de chaque rangée d'une table. La performance est également très importante pour moi.



2
votes

Une solution que j'ai trouvée était d'utiliser Join: XXX PRE>

Ce retour: P>

 a | b  | c  | is_it | perimeter 
---+----+----+-------+-----------
 1 |  2 |  3 | f     |         6
 3 |  4 |  5 | t     |        12
 5 | 12 | 13 | t     |        30
(3 rows)


1 commentaires

Une autre façon d'exprimer la jointure croisée consiste à utiliser rejoindre check_it (A, B, C) sur true ou simplement utiliser croix rejoindre .