2012-08-09 3 views
1

Я работаю над Microsoft SQL Server 2005 с Transact-SQL.Угрозы/недостатки за ISNULL(), NULLIF() и COALESCE()

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

Скажет, например, таблица Person и столбцы FirstName, SurnamePrefix, LegalSurname

Это случилось, что конкатенации значения строки со значением NULL (исходя из двух разных столбцов) возвращает в выходном значение NULL. Я пробовал различные сценарии для предотвращения NULL значений на выходе:

  • Начиная от:
    • Person.FirstName + ' ' + COALESCE(RTRIM(LTRIM(Person.SurnamePrefix)) + ' ', '') + Person.LegalSurname
  • Я изменил свое заявление:
    • COALESCE(Person.FirstName + ' ', '') + COALESCE(Person.SurnamePrefix, '') + COALESCE(' ' + Person.LegalSurname, '')

Потом я наткнулся на функции, как ISNULL(), NULLIF() и т.д.

Какой самый лучший и эффективный подход, чтобы показать пустые значения строк в выходе, а не NULL значения? Является ли решение затронутым версией SQL Server? (т. е. 2005, 2008 и т. д.)

+3

2012 имеет ['CONCAT'] (http://msdn.microsoft.com/en-us/library/hh231515.aspx), где значения Null неявно преобразуются в пустую строку –

ответ

2

ISNULL подходит для значений по умолчанию, как вы это делаете. COALESCE имеет то преимущество, что принимает более двух аргументов. NULLIF совсем другое, поскольку оно возвращает NULL, если аргументы равны.

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

1

Это не прямой ответ на ваш вопрос, но, несмотря на то, что он не рекомендуется в будущих версиях SQL Server, SQL 2005 позволяет установить CONCAT_NULL_YIELDS_NULL на уровне соединения. (Также можно установить его на уровне базы данных с помощью команды ALTER DATABASE, но это может повлиять на поведение существующих запросов). Вы можете установить это перед запуском ваших запросов:

SET CONCAT_NULL_YIELDS_NULL OFF 

SELECT 'a' + NULL 

дает результат

a 

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

1

Aaron Bertrand comparedCOALESCE с ISNULL и не обнаружил существенной разницы в производительности между ними.

Смежные вопросы