Подтвердить что ты не робот

В чем разница: ifnull и coalesce в mysql?

select ifnull(null,'replaces the null')
-->replaces the null

select coalesce(null,null,'replaces the null')
-->replaces the null

В обоих предложениях основное различие заключается в передаче аргументов. Для ifnull это два параметра и объединить 2 или 3, которые мы можем пройти, за исключением того, что у нас есть какая-либо другая разница между этими двумя? И как он отличается в MSSql.

4b9b3361

Ответ 1

Основное различие между ними состоит в том, что функция IFNULL принимает два аргумента и возвращает первый, если он не NULL, или второй, если первый NULL.

COALESCE функция может принимать два или более параметров и возвращает первый параметр, отличный от NULL, или NULL, если все параметры равны нулю, например:

SELECT IFNULL('some value', 'some other value');
-> returns 'some value'

SELECT IFNULL(NULL,'some other value');
-> returns 'some other value'

SELECT COALESCE(NULL, 'some other value');
-> returns 'some other value' - equivalent of the IFNULL function

SELECT COALESCE(NULL, 'some value', 'some other value');
-> returns 'some value'

SELECT COALESCE(NULL, NULL, NULL, NULL, 'first non-null value');
-> returns 'first non-null value'

ОБНОВЛЕНИЕ: MSSQL выполняет более строгий контроль типов и параметров. Кроме того, он не имеет функции IFNULL, а вместо этого функции ISNULL, которая должна знать типы аргументов. Поэтому:

SELECT ISNULL(NULL, NULL);
-> results in an error

SELECT ISNULL(NULL, CAST(NULL as VARCHAR));
-> returns NULL

Также функция COALESCE в MSSQL требует, чтобы хотя бы один параметр был не нулевым, поэтому:

SELECT COALESCE(NULL, NULL, NULL, NULL, NULL);
-> results in an error

SELECT COALESCE(NULL, NULL, NULL, NULL, 'first non-null value');
-> returns 'first non-null value'

Ответ 2

Различия в SQL-Server:

  • Нет функции IFNULL(), но аналогичный ISNULL()

  • ISNULL принимает только 2 параметра, тогда как COALESCE принимает переменное количество параметров

  • COALESCE основан на стандарте ANSI SQL, тогда как ISNULL - это собственная функция TSQL

  • Проверки для ISNULL и COALESCE также различны. Например, значение NULL для ISNULL преобразуется в int, тогда как для COAELSCE вы должны указать тип. Пример:

    • ISNULL(NULL,NULL): is int.

    • COALESCE(NULL,NULL): выдает ошибку.

    • COALESCE(CAST(NULL as int),NULL): действителен и возвращает int.

  • Определение типа данных результирующего выражения - ISNULL использует первый тип параметра, COALESCE следует правилам выражения CASE и возвращает тип значения с наивысшим приоритетом.

Ответ 3

Плюсы COALESCE

  • COALESCE - это стандартная SQL-функция.

    Хотя IFNULL является специфичным для MySQL, а его эквивалент в MSSQL (ISNULL) специфичен для MSSQL.

  • COALESCE может работать с двумя или более аргументами (на самом деле он может работать с одним аргументом, но в этом случае он бесполезен: COALESCE(a)a).

    В то время как MySQL IFNULL и MSSQL ISNULL ограниченные версии COALESCE, которые могут работать только с двумя аргументами.

Минусы COALESCE

  • Per Документация Transact SQL, COALESCE - это просто синтаксический сахар для CASE и может его оценить аргументов больше, чем раз. Более подробно: COALESCE(a1, a2, …, aN)CASE WHEN (a1 IS NOT NULL) THEN a1 WHEN (a2 IS NOT NULL) THEN a2 ELSE aN END. Это значительно снижает полезность COALESCE в MSSQL.

    С другой стороны, ISNULL в MSSQL является нормальной функцией и никогда не оценивает его аргументы более одного раза. COALESCE в MySQL и PostgreSQL не оценивает его аргументы более одного раза.

  • В этот момент я не знаю, как именно SQL-стандарты определяют COALESCE.

    Как мы видим из предыдущего пункта, фактические реализации в СУРБД различаются: некоторые (например, MSSQL) делают COALESCE для оценки его аргументов более одного раза, некоторые (например, MySQL, PostgreSQL) - не делают.

    c-treeACE, который утверждает, что реализация COALESCE совместима с SQL-92, говорит: "Эта функция не разрешена в Предложение GROUP BY. Аргументы этой функции не могут быть выражением запроса." Я не знаю, действительно ли эти ограничения соответствуют стандарту SQL; большинство фактических реализаций COALESCE (например, MySQL, PostgreSQL) не имеют таких ограничений. IFNULL/ISNULL, как обычные функции, также не имеют таких ограничений.

Резюме

Если вы не сталкиваетесь с определенными ограничениями COALESCE в определенных РСУБД, я бы рекомендовал всегда использовать COALESCE как более стандартный и более общий.

Исключения составляют:

  • Длинные вычисленные выражения или выражения с побочными эффектами в MSSQL (как, например, в документации, COALESCE(expr1, …) могут дважды оценивать expr1).
  • Использование в GROUP BY или с выражениями запроса в c-treeACE.
  • Etc.

Ответ 4

ifnull может заменить только нулевое значение первого параметра. В то время как coalesce может заменить любое значение другим значением. С coalesce в стандартном SQL вы можете иметь множество параметров, преобразующих многие значения.

ИЗМЕНИТЕ пример в соответствии с комментариями ниже.

Пример: coalesce(null, null, null, 'b*', null, 'null*') возвращает 'b *', и это невозможно сделать с ifnull.

Ответ 5

Этот db2 SQL не будет работать с COALESE, я не увижу извлеченных строк. Поскольку я использовал IFNULL, он работает как ожидалось

select a.mbitno ,a.mbstqt,ifnull(b.apr,0)
from
( 
    select mmstcd,mbstat,mbfaci,mbwhlo,mbitno,mbstqt,MBALQT from libl.mitbal  inner join libl.mitmas on 
    mmcono=mbcono and mmitno=mbitno 
    where mbcono=200 and mbstat in ('20','50') and mmstcd>0  
)  
as a left join 
(
    select mlfaci,mlwhlo,mlitno,mlstas,sum(mlstqt) as APR from libl.mitloc where mlcono=200 and mlstas='2'
    group by mlfaci,mlwhlo,mlitno,mlstas
) 
b on b.mlfaci=a.mbfaci and b.mlwhlo=a.mbwhlo and b.mlitno=a.mbitno 
where a.mbitno in 'GWF0240XPEC' and a.mbstqt>0 and a.mbstqt<>ifnull(b.apr,0)