Comment obtenir le MIN () de deux champs dans Postgres?


140

Disons que j'ai une table comme celle-ci:

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

Je souhaite 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, quand j'essaye ceci dans Postgres, j'obtiens, "Aucune fonction ne correspond au nom et aux types d'argument donnés. Vous devrez peut-être ajouter des transtypages de types explicites." MAX () et MIN () semblent fonctionner sur les lignes plutôt que sur les colonnes.

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

Réponses:


247

MOINS (a, b):

Les fonctions GREATESTet LEASTsélectionnent la valeur la plus grande ou la plus petite dans une liste d'un nombre quelconque d'expressions. Les expressions doivent toutes être convertibles en un type de données commun, qui sera le type du résultat (voir Section 10.5 pour plus de détails). Les valeurs NULL de la liste sont ignorées. Le résultat sera NULL uniquement si toutes les expressions sont évaluées à NULL.

Notez que GREATESTet LEASTne sont pas dans le standard SQL, mais sont une extension courante. Certaines autres bases de données les font retourner NULL si un argument est NULL, plutôt que seulement quand tous sont NULL ...


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


-16

Vous pouvez obtenir la réponse en mettant ces données dans une colonne comme celle-ci:

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

Ici, nous mettons la valeur minimale entre score_aet score_bet l'imprimons en stockant cette valeur dans une colonne nommée minimum_score.


seul min(expression)existe. Définition tirée de la documentation: la valeur minimale de l'expression sur toutes les valeurs d'entrée avec «expression» est tout type numérique, chaîne, date / heure, réseau ou énumération, ou tableaux de ces types
charlesdg
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.