PostgreSQL БОЛЬШОЙ с NULL - PullRequest
       5

PostgreSQL БОЛЬШОЙ с NULL

0 голосов
/ 06 февраля 2020

Используя PostgreSQL, я ищу что-то вроде SELECT GREATEST(0,x), где x может быть NULL. В случае x IS NULL запрос должен вернуть NULL, аналогично MySQL и Google BigQuery, а не 0, что является стандартным поведением в PostgreSQL. Есть ли простой способ выполнить sh без случаев и условий?

SELECT GREATEST(0,NULL) должен возвращать NULL, а не 0

В официальной документации:

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

Обратите внимание, что GREATEST и LEAST не соответствуют стандарту SQL, но являются общим расширением. В некоторых других базах данных они возвращают NULL, если любой аргумент равен NULL, а не только тогда, когда все имеют значение NULL.

https://www.postgresql.org/docs/9.6/functions-conditional.html

Я ищу САМАЯ БОЛЬШАЯ функция, которая не игнорирует NULL

Ответы [ 3 ]

2 голосов
/ 06 февраля 2020

Вы можете добавить другое выражение. Для чисел:

select greatest(a, b, c) + (a + b + c - (a + b + c))

Это немного сложнее для других типов данных. Но массивы могут помочь:

select greatest(a, b, c) * nullif( array_position(array[a, b, c], null) is not null), true )::int
2 голосов
/ 06 февраля 2020

Вы можете написать свою собственную функцию:

create function strange_greatest(variadic p_input int[])
  returns int
as
$$
  select v
  from unnest(p_input) as t(v)
  order by t desc nulls first
  limit 1;
$$
language sql
immutable;
postgres=> select strange_greatest(1,2,4);
strange_greatest
----------------
               4
(1 row)

postgres=> select strange_greatest(1,2,null,4);
strange_greatest
----------------

(1 row)
1 голос
/ 06 февраля 2020

Для случая 2 чисел (столбцов), если ваша таблица выглядит следующим образом:

create table tablename(a int, b int);

insert into tablename(a, b) values
(10, 20), (null, 30), (40, null);

, тогда используйте функцию greatest(), например:

select 
  greatest((a + b) - b, (a + b) - a) "greatest"
from tablename;

Если a или b равно null, тогда оба выражения: (a + b) - b и (a + b) - a равны null, и функция greatest() вернет null. Смотрите демо . Результаты:

| greatest |
| -------- |
| 20       |
| null     |
| null     |
...