2015-04-22 5 views
2

Почему GREATEST(createdTS, modifiedTS) с одним из столбцов «null» возвращает «null»?mySQL «наибольший» с двумя столбцами, которые могут быть нулевыми

Если один из них равен нулю, мне просто нужно значение другого. Если оба значения равны нулю, то null.

Как я могу это сделать?

Как я заметил, я могу использовать COALESCE как GREATEST(COALESCE(createdTS,0), COALESCE(modifiedTS,0)) - это лучшее решение?

+0

Попробуйте использовать Greatest (NVL (createdTS, 0), NVL (modifiedTS_0)). Логические операции с NULL приводят к NULL. – Veverke

+0

Только что узнал, что БОЛЬШЕ (COALESCE (createdTS, 0), COALESCE (modifiedTS, 0)) действительно работает - это лучше? Или ваш предпочитает? –

+0

В этом случае я не вижу причин использовать Coalesce вместо NVL. Coalesce предназначен, если у вас есть выражения с несколькими значениями, здесь ваши столбцы являются одиночными значениями. – Veverke

ответ

2

Да, вот как null есть, поэтому вы можете сделать это, используя ifnull.
https://dev.mysql.com/doc/refman/5.0/en/working-with-null.html

Вы можете сделать что-то вроде этого:

mysql> select GREATEST(ifnull(1234,0),ifnull(null,0)) as g; 
+------+ 
| g | 
+------+ 
| 1234 | 
+------+ 
1 row in set (0.00 sec) 

Если вы делаете сравнение для не дробных данных, вы можете сделать это, как указано выше.

Вы также можете использовать функцию COALESCE.

+0

Он работает для меня с типом даты: выберите *, наибольший (ifnull (dateA, '1970-01-01'), ifnull (dateB, '1970-01-01')) как dateMax – SkaJess

1

Перед MySQL 5.0.13, GREATEST() возвращает NULL, только если все аргументы равны NULL. Начиная с 5.0.13, он возвращает NULL, если любой аргумент равен NULL.

+0

tbh, какое глупое решение. Как NULL когда-либо больше даты, чем фактическая дата. –

+0

https://dev.mysql.com/doc/refman/5.0/ru/comparison-operators.html#function_greatest –

+1

Это не значит быть большим или нет. Речь идет о значении «NULL». Если значение null является «неизвестным», выполнение любой логической операции, такой как «большой», «равный» и т. Д. С «неизвестным» - как я могу узнать, если A> NULL, если я не могу сказать ничего о NULL? Затем операция возвращает NULL. Кажется логикой. – Veverke