181 votes

Comment puis-je obtenir la valeur MIN() de deux champs dans Postgres ?

Disons que j'ai un tableau comme celui-ci :

name | score_a | score_b
-----+---------+--------
 Joe |   100   |   24
 Sam |    96   |  438
 Bob |    76   |  101
 ... |   ...   |  ...

Je voudrais sélectionner le minimum de score_a et score_b. En d'autres termes, quelque chose comme :

SELECT name, MIN(score_a, score_b)
FROM table

Les résultats, bien sûr, seraient :

name | min
-----+-----
 Joe |  24
 Sam |  96
 Bob |  76
 ... | ...

Cependant, lorsque j'essaie de le faire dans Postgres, j'obtiens le message suivant : "Aucune fonction ne correspond au nom et aux types d'arguments donnés. Vous devrez peut-être ajouter des casts de type explicites". MAX() et MIN() semblent fonctionner à travers rangées plutôt que colonnes.

Est-il possible de faire ce que j'essaie de faire ?

337voto

cagcowboy Points 13721

LE MOINS (a, b) :

El GREATEST y LEAST Les fonctions sélectionnent la plus grande ou la plus petite valeur dans une liste d'un nombre quelconque d'expressions. Les expressions doivent toutes pouvoir être converties en un type de données commun, qui sera le type du résultat (cf. Section 10.5 pour plus de détails). Les valeurs NULL dans la liste sont ignorées. Le résultat sera NULL seulement si toutes les expressions sont évaluées à NULL.

Notez que GREATEST y LEAST ne font pas partie de la norme SQL, mais constituent une extension courante. D'autres bases de données leur font retourner NULL si un argument est NULL, plutôt que seulement quand tous sont NULL...

35 votes

Pour les personnes qui, comme moi, auront également besoin MAX() de deux valeurs, c'est GREATEST(a, b) :)

2 votes

@vektor : belle façon d'ajouter des mots de recherche supplémentaires pour que cette réponse puisse être trouvée via Google !

32voto

Bill Karwin Points 204877

Voici le lien vers les documents relatifs à l'outil de gestion de l'environnement. LEAST() dans PostgreSQL :

http://www.postgresql.org/docs/current/static/functions-conditional.html#AEN15582

-1voto

Leketo Points 81
select name,
       case
         when score_a < score_b then
          score_a 
         when score_b < score_a then
          score_b 
         else 
          --both amounts are equal, so we show score_a
          score_a 
       end
  from table

-23voto

Mohamed Aamir Points 1

Vous pouvez obtenir la réponse en plaçant ces données dans une colonne comme ceci :

SELECT name, MIN(score_a, score_b) as minimum_score
FROM table

Ici, nous mettons la valeur minimale parmi score_a y score_b et d'imprimer la même chose en stockant cette valeur dans une colonne nommée minimum_score .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X