Выберите столбец MAX on Date, который не работает с пустой таблицей - PullRequest
2 голосов
/ 28 апреля 2011

Я выполняю следующий запрос к одной из моих таблиц, в которой есть столбец даты.

select max(date) from mydate

Проблема в том, что если таблица пуста, то и возвращать строку.Я использую Oracle 11.

Есть предложения?

Ответы [ 5 ]

7 голосов
/ 28 апреля 2011

Это допустимое поведение: агрегатные функции обычно возвращают NULL, применяемый к пустому набору, а COUNT(*) возвращает 0.

Если вам не нужна строка в таблицепусто, используйте это:

SELECT  MAX(date)
FROM    mydate
HAVING  COUNT(*) > 0
2 голосов
/ 28 апреля 2011

На самом деле это работает.Это просто не работает так, как вы думаете.Всегда возвращать результат - документированное поведение для агрегирующих функций .

SQL> select ts from t23;

TS
---------
25-APR-11
26-APR-11

SQL> select max(ts) from t23
  2  /

MAX(TS)
---------
26-APR-11

SQL> delete from t23
  2  /

2 rows deleted.

SQL> select max(ts) from t23
  2  /

MAX(TS)
---------


SQL>

Однако, если вы действительно хотите пустой набор и обрабатываете его соответствующим образом, вам придется сделать что-то вроде этого:

SQL> select max_ts from
  2      ( select max(ts) as max_ts from t23 )
  3  where max_ts is not null
  4  /

no rows selected

SQL>

Хм, решение Quassnoi точнее (меньше набирает):

SQL> select max(ts) from t23
  2  having count(*) > 0
  3  /

no rows selected

SQL>

Как указывает Quassnoi, мое решение вернет пустой набор, даже если в таблице есть строкипри условии, что ни один экземпляр столбца TS не заполнен.Решение Q вернуло бы строку с нулевым результатом при тех же обстоятельствах.От бизнес-требований зависит, какой из результатов является правильным.

1 голос
/ 28 апреля 2011

Если вы хотите получить NULL, попробуйте:

CREATE TABLE my_date (
  the_date DATE
);

SELECT MAX(the_date) FROM my_date HAVING MAX(the_date) IS NOT NULL;

Приветствия,

0 голосов
/ 24 апреля 2012

выберите @maxPK = max (id) из #dd, имеющего count (id)> 0

, это будет работать.

0 голосов
/ 28 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...