Путаница в использовании Coalesce

Итак, я смотрел на этот вопрос и пытаюсь выяснить, используется ли Coalesce. правильно за ответ.

INSERT INTO users (user_id, name)
SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';

Прошу прощения, если это неправильный способ задать этот вопрос, но у меня не было достаточно представителей, чтобы прокомментировать этот пост 5-летней давности. Мое замешательство вызвано использованием Coalesce в этом ответе. Coalesce сравнивает два или более столбца и берет из них первое значение NON Null, если я правильно понимаю.

Проблема этого пользователя заключалась в том, что если значение «Боб» не существовало, то его поле user_id было бы 0 при вставке, что ему не нужно, потому что оно должно начинаться с 1.

Итак, правильно ли я понимаю coalesce, думая, что здесь это вообще не нужно, учитывая, что даже в ответе он просто поставил 0 для второго аргумента. Кажется, что Coalesce в этом примере ничего не дает, и на самом деле рабочая лошадка - это Select 1 + Select max ().

Опять же, я просто пытаюсь понять концепцию Coalesce, поскольку я натолкнулся на это как на пример проблемы, с которой я столкнулся.


person NitroFrost    schedule 12.11.2014    source источник


Ответы (1)


Запрос:

SELECT max(user_id) FROM users WHERE name='Bob'

Вернул бы NULL, если бы не было «Боб».

Таким образом, COALESCE() используется для возврата 0 вместо NULL в этом случае, а затем прибавляется 1, чтобы получить следующий, если был «Боб», или 1, если его не было.

Вы правы относительно COALESCE() взятия первого ненулевого значения из списка значений.

person Hart CO    schedule 12.11.2014
comment
Хорошо, поэтому Coalesce (x, 0), 0 в этом значении, должно быть сравниваемым значением. Есть ли за или против использования IFNULL () вместо Coalesce в этой ситуации? Мне все еще кажется, что Coalesce неправильно используют, но я понимаю, как он работает сейчас, благодаря вашему объяснению. - person NitroFrost; 12.11.2014
comment
COALESCE() находится во всех основных базах данных, а IFNULL() отсутствует в SQL Server, который вместо этого использует ISNULL(). Производительность не должна отличаться. - person Hart CO; 12.11.2014