Як отримати MIN () двох полів у Postgres?


140

Скажімо, у мене така таблиця:

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

Я хотів би вибрати мінімум score_a та score_b. Іншими словами, щось на кшталт:

SELECT name, MIN(score_a, score_b)
FROM table

Результати, звичайно, були б:

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

Однак, коли я намагаюся це зробити у Postgres, я отримую: "Жодна функція не відповідає заданому типу імен та аргументів. Можливо, вам потрібно буде додати чіткі касти типу". MAX () та MIN (), здається, працюють у рядках, а не у стовпцях.

Чи можна робити те, що я намагаюся?

Відповіді:


246

ОСТАННЯ (a, b):

Функції GREATESTта LEASTвибирають найбільше або найменше значення зі списку будь-якої кількості виразів. Усі вирази повинні бути перетворені в загальний тип даних, який буде типом результату (детальніше див. Розділ 10.5 ). Значення NULL у списку ігноруються. Результат буде NULL, лише якщо всі вирази оцінюються як NULL.

Зверніть увагу , що GREATESTі LEASTне в стандарті SQL, але загальне розширення. Деякі інші бази даних змушують їх повертати NULL, якщо будь-який аргумент NULL, а не лише тоді, коли всі NULL ...


20
Для таких людей, як я, яким також знадобляться MAX()два значення, це GREATEST(a, b):)
vektor


-16

Відповідь можна отримати, помістивши ці дані у такий стовпець:

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

Тут ми ставимо мінімальне значення серед score_aта score_bдрукуємо те саме, зберігаючи це значення у стовпці з назвою minimum_score.


min(expression)є лише існуючий. Визначення з doc: мінімальне значення вираження для всіх вхідних значень з `виразом '- це будь-який числовий, рядок, дата / час, мережа або тип перерахунку, або масиви цих типів
charlesdg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.