Пункт СЛУЧАЯ T-SQL: Как указать КОГДА ПУСТОЙ УКАЗАТЕЛЬ

Я записал Оператор T-SQL, подобный как это (исходный выглядит по-другому, но я хочу дать легкий пример здесь):

SELECT first_name + 
    CASE last_name WHEN null THEN 'Max' ELSE 'Peter' END AS Name
FROM dbo.person

Этот Оператор не имеет никаких синтаксических ошибок, но пункт случая всегда выбирает ELSE-part - также, если last_name является пустым. Но Почему?

То, что я хочу сделать, должно объединить first_name и last_name, но если last_name является пустым, целое имя становится пустым:

SELECT first_name +
   CASE last_name WHEN null THEN '' ELSE ' ' + last_name END AS Name 
FROM dbo.person

Вы знаете, где проблема?

208
задан Michał Powaga 14 March 2013 в 21:07
поделиться

6 ответов

CASE WHEN last_name IS NULL THEN '' ELSE ' '+last_name END
350
ответ дан 23 November 2019 в 04:41
поделиться

Существует множество решений, но ни одно из них не объясняет, почему исходное утверждение не работает.

CASE last_name WHEN null THEN '' ELSE ' '+last_name

После when идет проверка на равенство, которое должно быть истинным или ложным.

Если одна или обе части сравнения равны null, результатом сравнения будет UNKNOWN, что в структуре case рассматривается как false. См: https://www.xaprb.com/blog/2006/05/18/why-null-never-compares-false-to-anything-in-sql/

Чтобы избежать этого, лучше всего использовать Coalesce.

11
ответ дан 23 November 2019 в 04:41
поделиться

Проблема в том, что null не считается равным самому себе, поэтому предложение никогда не совпадает.

Вам необходимо явно проверить наличие null:

SELECT CASE WHEN last_name is NULL THEN first_name ELSE first_name + ' ' + last_name
7
ответ дан 23 November 2019 в 04:41
поделиться

Часть WHEN сравнивается с ==, но вы не можете сравнивать с NULL. Попробуйте вместо этого

CASE WHEN last_name is NULL  THEN ... ELSE .. END

или COALESCE:

COALESCE(' '+last_name,'')

('' + last_name равно NULL, когда last_name равно NULL, поэтому в этом случае он должен возвращать '')

37
ответ дан 23 November 2019 в 04:41
поделиться

Учитывая ваш запрос, вы также можете сделать это:

SELECT first_name + ' ' + ISNULL(last_name, '') AS Name FROM dbo.person
11
ответ дан 23 November 2019 в 04:41
поделиться

try:

SELECT first_name + ISNULL(' '+last_name, '') AS Name FROM dbo.person

Это добавляет пробел к фамилии, если оно равно null, весь пробел + фамилия переходит в NULL, и вы получаете только имя, в противном случае вы получаете имя + пробел + фамилия.

это будет работать до тех пор, пока установлена настройка по умолчанию для конкатенации с пустыми строками:

SET CONCAT_NULL_YIELDS_NULL ON 

это не должно быть проблемой, так как режим OFF исчезает в будущих версиях SQl Server

5
ответ дан 23 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: