Как я могу определить нулевое или нулевое значение для COALESCE?

Как вы знаете, COALESCE возвращает первое значение, отличное от null. Теперь я должен сказать, либо не-null, либо не-0. Как я могу это сделать?

Вот мой код:

SELECT COALESCE(qa2.AcceptedAnswer, qa.AcceptedAnswer) AcceptedAnswer
FROM qanda
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
1 091
2

Ответы 2

Один метод использует NULLIF():

SELECT COALESCE(NULLIF(qa2.AcceptedAnswer, 0), qa.AcceptedAnswer) as AcceptedAnswer
FROM qanda;

Лично я предпочитаю выражение CASE, потому что считаю его намерение более явным:

select (case when qa2.AcceptedAnswer <> 0 then qa2.AcceptedAnswer
             else qa.AcceptedAnswer
        end) as AcceptedAnswer

Обратите внимание, что явное сравнение NULL не требуется; <> позаботится об этом.

Ваше первое решение неверно. Поскольку SELECT COALESCE(0, 1) возвращает 0. Хотя в моем вопросе написано «Мне нужно вести себя с 0 как с NULL, поэтому 0 следует игнорировать»

Martin AJ 30.07.2018 20:43

@MartinAJ: nullif (0, 0) дает NULL, поэтому coalesce(nullif (0, 0), 1) = coalesce(NULL, 1) возвращает 1, а не 0. Вы можете спутать nullif () с ifnull() (обратите внимание на разные позиции «если» в именах функций.).

sticky bit 30.07.2018 20:56

Нет, первое решение @Gordon правильное. «Если qa2 равно нулю, рассматривать его как NULL». Если qa2 = 0 и qa = 1, первое слияние будет COALESCE (NULL, 1) = 1.

Russell Fox 30.07.2018 20:56

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

SELECT COALESCE(CASE WHEN qa2.AcceptedAnswer<> 0 THEN qa2.AcceptedAnswer END
           ,CASE WHEN qa.AcceptedAnswer <> 0 THEN qa.AcceptedAnswer END)
FROM T

sqlfiddle

Другие вопросы по теме