Операторы сравнения и null

Wicked

Новичок
Операторы сравнения и null

Задался тут вопросом: как сделать так, чтобы при сравнениях операторами <, >, <=, >= значения NULL были "меньше" любых не-NULL-овых значений? Как известно из мануала MySQL:
Код:
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+
.

На данный момент я углядел два метода (на примере оператора <):
1) более правильный метод
Код:
if(
   isnull(val1),
   if(
      isnull(val2),
      0, /* null < null ? */
      1  /* null < N ? */
   ),
   if(
      isnull(val2),
      0, /* N < null ? */
      val1 < val2 /* N < M*/
   )
)
2) имхо менее правильный, но более которкий, более читаемый, и наверное более быстрый (используя минимальное значение signed bigint):
Код:
ifnull(val1, -9223372036854775808) < ifnull(val2, -9223372036854775808)
Что скажет народ?

-~{}~ 06.02.06 18:29:

Забыл добавить:
под val1, val2 подразумеваются как поля таблиц, так и константные значения.
 

Beetle(c)]u$

Новичок
больше или меньше null'a значение быть не может

если в SQL запросе, то просто пишешь
[sql]where val is not null[/sql]
 

Wicked

Новичок
Спасибо, про val IS NULL я уже знаю. Так же, как и согласен с утверждением, что "больше или меньше null'a значение быть не может".

Но есть пара других аргументов:
1) есть такой оператор <=>:
Код:
<=> 
NULL-safe equal. This operator performs an equality comparison
like the = operator, but returns 1 rather than NULL if both
operands are NULL, and 0 rather than NULL if one operand is NULL. 
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

<=> was added in MySQL 3.23.0.
2) при использовании "ORDER BY val asc/desc" NULL величины явно* позиционируются относительно не-NULL величин. А order by на самом деле есть ни что иное, как упорядочивание операторами <, >.
When using ORDER BY, NULL values are presented first, or last if you specify DESC to sort in descending order.
*Exception: In MySQL 4.0.2 through 4.0.10, NULL values sort first regardless of sort order.
Так почему бы не сделать то же самое, используя операторы, подобные <, >, только нормально обрабатывающие NULLы?

-~{}~ 07.02.06 19:50:

хоть собеседников толком и не нашлось, подведу итоги:

1) первый метод был доработан до более оптимальных конструкций, не содержащих никаких control flow functions.

2) от ifnull(val1, -9223372036854775808) < ifnull(val2, -9223372036854775808) пришлось отказаться.
 
Сверху