Предложение T-SQL CASE: как указать WHEN NULL - PullRequest
204 голосов
/ 13 июля 2010

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

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

В этом операторе нет синтаксических ошибок, но предложение case всегда выбирает ELSE-часть - также, если last_name равно null. Но почему?

Что я хочу сделать, это объединить first_name и last_name, но если last_name равно null, все имя становится пустым:

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

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

Ответы [ 14 ]

0 голосов
/ 22 июня 2017

Я попытался привести к строке и проверить строку нулевой длины, и это сработало.

CASE 
   WHEN LEN(CAST(field_value AS VARCHAR(MAX))) = 0 THEN 
       DO THIS
END AS field 
0 голосов
/ 19 мая 2017

Вы можете использовать функцию IsNull

select 
    isnull(rtrim(ltrim([FirstName]))+' ','') +
    isnull(rtrim(ltrim([SecondName]))+' ','') +
    isnull(rtrim(ltrim([Surname]))+' ','') +
    isnull(rtrim(ltrim([SecondSurname])),'')
from TableDat

если один столбец равен нулю, вы получите пустой символ

Совместимо с Microsoft SQL Server 2008 +

0 голосов
/ 29 октября 2015

Джейсон обнаружил ошибку, так что это работает ...

Кто-нибудь может подтвердить версии других платформ?
SQL Server:

SELECT
CASE LEN(ISNULL(last_name,'')) 
WHEN 0 THEN '' 
ELSE ' ' + last_name
END AS newlastName

MySQL:

SELECT
CASE LENGTH(IFNULL(last_name,'')) 
WHEN 0 THEN '' 
ELSE ' ' + last_name
END AS newlastName

Oracle:

SELECT
CASE LENGTH(NVL(last_name,'')) 
WHEN 0 THEN '' 
ELSE ' ' + last_name
END AS newlastName
0 голосов
/ 19 сентября 2014

Когда вы расстроены, пытаясь это:

CASE WHEN last_name IS NULL THEN '' ELSE ' '+last_name END

Попробуйте вместо этого:

CASE LEN(ISNULL(last_Name,''))
WHEN 0 THEN '' 
ELSE ' ' + last_name
END AS newlastName

LEN(ISNULL(last_Name,'')) измеряетколичество символов в этом столбце, которое будет равно нулю, независимо от того, пусто оно или равно NULL, поэтому WHEN 0 THEN будет принимать значение true и возвращать '', как и ожидалось.

Надеюсь, это полезная альтернатива.

Я включил этот тестовый пример для SQL Server 2008 и выше:

DECLARE @last_Name varchar(50) = NULL

SELECT 
CASE LEN(ISNULL(@last_Name,''))
WHEN 0 THEN '' 
ELSE 'A ' + @last_name
END AS newlastName

SET @last_Name = 'LastName'

SELECT 
CASE LEN(ISNULL(@last_Name,''))
WHEN 0 THEN '' 
ELSE 'A ' + @last_name
END AS newlastName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...