Я записал Оператор 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
Вы знаете, где проблема?
CASE WHEN last_name IS NULL THEN '' ELSE ' '+last_name END
Существует множество решений, но ни одно из них не объясняет, почему исходное утверждение не работает.
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.
Проблема в том, что null не считается равным самому себе, поэтому предложение никогда не совпадает.
Вам необходимо явно проверить наличие null:
SELECT CASE WHEN last_name is NULL THEN first_name ELSE first_name + ' ' + last_name
Часть WHEN сравнивается с ==, но вы не можете сравнивать с NULL. Попробуйте вместо этого
CASE WHEN last_name is NULL THEN ... ELSE .. END
или COALESCE:
COALESCE(' '+last_name,'')
('' + last_name равно NULL, когда last_name равно NULL, поэтому в этом случае он должен возвращать '')
Учитывая ваш запрос, вы также можете сделать это:
SELECT first_name + ' ' + ISNULL(last_name, '') AS Name FROM dbo.person
try:
SELECT first_name + ISNULL(' '+last_name, '') AS Name FROM dbo.person
Это добавляет пробел к фамилии, если оно равно null, весь пробел + фамилия переходит в NULL, и вы получаете только имя, в противном случае вы получаете имя + пробел + фамилия.
это будет работать до тех пор, пока установлена настройка по умолчанию для конкатенации с пустыми строками:
SET CONCAT_NULL_YIELDS_NULL ON
это не должно быть проблемой, так как режим OFF
исчезает в будущих версиях SQl Server