Я видел, что многие люди используют функцию COALESCE вместо ISNULL. По результатам поиска в Интернете я обнаружил, что COALESCE - это стандарт ANSI, поэтому есть преимущество в том, что мы знаем, чего ожидать при его использовании. Тем не менее, ISNULL кажется легче читать, так как кажется более ясным, что он делает.
Я также понимаю, что ISNULL довольно сложен, поскольку он действует по-разному на разных серверах баз данных и на разных языках.
Все это, на мой взгляд, сводится к стилю и стандартам. Учитывая, что стиль субъективен, есть ли причина использовать COALESCE вместо ISNULL (или наоборот)? В частности, есть ли преимущество в производительности одного над другим?
sql-server
syntax
Ричард
источник
источник
COALESCE
оценивается дважды.COALESCE
просто неОтветы:
COALESCE
внутренне переводится вCASE
выражение,ISNULL
является внутренней функцией двигателя.COALESCE
является стандартной функцией ANSI,ISNULL
это T-SQL.Различия в производительности могут возникать и возникают, когда выбор влияет на план выполнения, но разница в скорости необработанных функций незначительна .
источник
затем
Наконец, и самое интересное. Тип данных результата и длина / точность / масштаб
Этот последний бит объясняет, почему обычно используется ISNULL, потому что он более предсказуемый (?), А COALESCE может добавлять непреднамеренные преобразования типов данных: отсюда и происходит "медленный" бит
Все типы данных одинаковы, вы не увидите никакой практической разницы ...
источник
Как отметил Марк, вам будет сложно найти различия в производительности; Я думаю, что другие факторы будут более важными. Для меня я всегда использую COALESCE, и большая часть этого уже упоминалась вами или Марком:
Вы также должны быть уверены в том, что вы знаете, как обрабатывается приоритет типа данных с использованием двух функций, если вы используете его с различными типами данных / точностью и т. Д.
Запись
Есть одно исключение. Они обрабатываются по-разному в текущих версиях SQL Server:
COALESCE
Вариант будет на самом деле выполнитьsome_aggregate_query
дважды (один раз для проверки значения, и один раз , чтобы вернуть его , когда не ноль), в то время какISNULL
только выполнить подзапрос один раз. Я говорю о некоторых других различиях здесь:источник