Как использовать Coalesce в MySQL

Немного помогите здесь. Я действительно не понимаю, как использовать этот coalesce в MySQL

Я прочитал все страницы на странице 1, how to use coalsece в результатах Google.

Я знаю, что это означает, что он возвращает первое ненулевое значение, которое он встречает, и null в противном случае.

Но это все еще неопределенно для меня.

  1. Почему я увидел запросы, которые возвращают несколько значений? Разве это не только первое не пустое значение, которое возвращается?
  2. И как это решить, какой столбец для базы? coalesce(column1,column2)? что, если первый столбец равен null, а другой столбец не равен нулю?
  3. Или, если я ошибаюсь или мой синтаксис неверен, как я его правильно пишу?
  4. Может ли кто-нибудь предоставить очень хороший и простой пример того, как его использовать?
  5. И когда желательно использовать.

Ответ 1

  1. Почему я видел запросы, которые возвращают несколько значений? isnt это только первое не пустое значение, которое возвращается?

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

  2. И как это решить, какой столбец для базы? сливаться (column1, column2)? что, если первый столбец равен null, а другой столбец не равен нулю?

    В порядке его аргументов: в этом примере column1 перед column2.

  3. Или, если я ошибаюсь или мой синтаксис неверен, как мне его правильно записать?

    Ты не ошибаешься.

  4. Может ли кто-нибудь предоставить очень хороший и простой пример того, как его использовать?

    Из документации:

    
    mysql> SELECT COALESCE(NULL,1);
            -> 1
    mysql> SELECT COALESCE(NULL,NULL,NULL);
            -> NULL
    
  5. И когда желательно использовать.

    Желательно использовать каждый раз, когда вы хотите выбрать первое значение, отличное от NULL, из списка.

Ответ 2

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

Скажем, например, я хочу получить номер телефона из таблицы клиентов, и у них есть 3 столбца для телефонных номеров с именем "мобильный", "домашний" и "работа", но я хочу получить только первое число, которое не пустое.

В этом случае у меня есть приоритет мобильного, затем дома, а затем работа.

TABLE STRUCTURE
--------------------------------------------
| id | customername | mobile | home | work |
--------------------------------------------
| 1  | Joe          | 123    | 456  | 789  |
--------------------------------------------
| 2  | Jane         |        | 654  | 987  |
--------------------------------------------
| 3  | John         |        |      | 321  |
--------------------------------------------

SELECT id, customername, COALESCE(mobile, home, work) AS phone FROM customers

RESULT
------------------------------
| id | customername | phone  |
------------------------------
| 1  | Joe          | 123    |
------------------------------
| 2  | Jane         | 654    |
------------------------------
| 3  | John         | 321    |
------------------------------

Ответ 3

COALESCE вернет первый ненулевой столбец или значение.

Пример использования:

SELECT COALESCE(my_column, my_other_column, 'default') as username FROM my_table;

Примеры результатов:

my_column  my_other_column     results
null       null                'default'
null       0                   '0'
null       'jimmy'             'jimmy'
'bob'      'jimmy'             'bob'

Ответ 4

Это прекрасный пример того, что Coalesce if изменит поля/столбцы null на то, что вы хотите, чтобы они были в случае с null на 0 и 1.

Скопируйте это в редактор MySQL, это будет выглядеть намного лучше

Select "Column1 (Dont Want Touched)", 
  coalesce(column2(That you want set to 0 if null), 0) as column2 /* (give it same name as was e.g. "column2") */, 
  coalesce(column3(Instead of null set to 1) ,1) as column3 /* (give it same name as was e.g. "column3") */ 
from "MydataTable" 
Where 'somedates' in ('2015-04-10', '2015-04-03', '2015-03-27', '2015-04-17')  and id = 10 order by 'somedates';