понять IFNULL mysql - PullRequest
       15

понять IFNULL mysql

0 голосов
/ 15 февраля 2019

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

SELECT user_id, 
       (CASE WHEN IFNULL(condition,1) = 0 THEN 1 ELSE IFNULL(condition,1) END)::int adjusted_condition, TRANSACT_ID
FROM user_transaction

Когда я пытаюсь понять, разбивая IFNULL(condition,1) = Это в основном присваивает 1 условию, когда условие NULL

Вот данные без регистразаявление:

+---------+-----------+-------------+                                           
| USER_ID | CONDITION | TRANSACT_ID |
|---------+-----------+-------------|
|       1 | NULL      |      40779 |
|       4 | NULL      |      40779 |
|       1 | 1         |      40855 |
|       2 | 1         |      40855 |
|       1 | 1         |      40864 |
|       2 | 1         |      40864 |
|       1 | 1         |      40876 |
|       2 | 4         |      40876 |
|       3 | 4         |      40876 |
|       4 | 4         |      40876 |
+---------+-----------+-------------+

Ответы [ 5 ]

0 голосов
/ 16 февраля 2019

Вот еще один способ написать выражение, даже более краткое:

COALESCE(NULLIF(condition, 0), 1)

NULLIF () возвращает NULL, если два его аргумента равны, или же возвращает первый аргумент.Таким образом, в этом выражении он вернет NULL, если условие равно NULL или 0. Поэтому COALESCE () возвращает 1, если NULLIF () возвращает NULL.

Если условие не NULL, но не равно 0, то NULLIF () вернет это ненулевое значение, а COALESCE () также вернет то же значение.

0 голосов
/ 16 февраля 2019

Условие (т. Е. Логическое выражение) является истинным, ложным или нулевым.В MySQL эти логические значения имеют числовые эквиваленты: true = 1, false = 0, null = null.IFNULL принимает два аргумента.Если первый аргумент равен нулю, он возвращает второй аргумент, в противном случае первый.

Вот что делает IFNULL(condition,1):

condition           | true = 1 | false = 0 | null
IFNULL(condition,1) | true = 1 | false = 0 | true = 1

Итак, выражение, которое приводит к нулю (например, 123 = null) заканчивается как true.

Затем вы применяете это выражение case:

CASE WHEN IFNULL(condition,1) = 0 THEN 1 ELSE IFNULL(condition,1) END

В случае, если IFNULL result равно 0 (false), все выражение case становится 1 (true)).В противном случае вы сохраняете результат IFNULL.

condition           | true = 1 | false = 0 | null
IFNULL(condition,1) | true = 1 | false = 0 | true = 1
result              | true = 1 | true = 1  | true = 1

В итоге вы всегда получаете 1. Таким образом, вы получаете

select user_id, 1 as adjusted_condition, transact_id
from user_transaction
0 голосов
/ 16 февраля 2019

Выражение, кажется, преобразует NULL и 0 в 1, иначе исходное значение.Для ясности это можно просто записать как:

CASE WHEN condition IS NULL THEN 1
     WHEN condition = 0 THEN 1
     ELSE condition END
0 голосов
/ 16 февраля 2019

В этом случае утверждение:

CASE 
  WHEN IFNULL(condition, 1) = 0 THEN 1 
  ELSE IFNULL(condition, 1) 
END

, если condition равно нулю , то IFNULL(condition, 1) возвращает 1 и (поскольку 1 = 0 возвращает false),затем ELSE IFNULL(condition, 1) возвращается наконец 1если condition равно 0 , то IFNULL(condition, 1) возвращает 0 и (поскольку 0 = 0 возвращает true),наконец 1 возвращаетсяесли condition не равно нулю и не равно 0 , тогда IFNULL(condition, 1) возвращает condition и (поскольку condition = 0 возвращает false),тогда ELSE IFNULL(condition, 1) возвращается наконец conditionТак что это эквивалентно:

CASE 
  WHEN IFNULL(condition, 0) = 0 THEN 1 
  ELSE condition 
END
0 голосов
/ 15 февраля 2019

Во-первых, ifnull() эквивалентно coalesce().Я настоятельно рекомендую последнее, потому что это стандартная функция для замены NULL s.

Во-вторых, ifnull() довольно избыточно в case.В этом случае NULL s никогда не соответствуют значениям, поэтому это эквивалентно.

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

SELECT user_id, 
       (CASE WHEN condition = 0 THEN 1
             ELSE COALESCE(condition, 0)
        END)::int adjusted_condition,
       TRANSACT_ID
FROM user_transaction
...