2013-10-09 6 views
2

У меня есть этот оператор select, и то, что я пытаюсь выполнить, - это когда AuditLog имеет значение null, а затем устанавливает «Enabled», но мои проблемы: я не уверен, как обращаться с ним, когда он не является NULL, я хочу иметь возможность получать данные из AuditLog в AuditLogEnabled, если он не является нулевым. Я попытался добавить другое, но не смог заставить его работать. может кто-нибудь покажет мне правильный способ написать это.MS sql Case Statement

select FirstName,AuditLog, 
CASE WHEN AuditLog IS NULL THEN 'Enabled' END AS AuditLogEnabled 
from UserDetail 
where FirstName = 'test' 
+0

Не заставить его работать - вы получаете ошибку или что-то еще? – thursdaysgeek

ответ

3

Я бы рекомендовал сделать это с использованием COALESCE -

SELECT FirstName,AuditLog,COALESCE(AuditLog,'Enabled') AS AuditLogEnabled 
FROM UserDetail 
WHERE FirstName = 'test' 

Причина использования COALESCE - ISNULL зависит от типа данных первого аргумента. И иногда это приводит к усечению данных - Для примера -

DECLARE @value VARCHAR(5) 
SELECT 'Using COALESCE', COALESCE(@value, 'My String') 
SELECT 'Using ISNULL', ISNULL(@value, 'My String') 

Результат -

Using COALESCE My String 
Using ISNULL My St 

Это может быть серьезной проблемой. Не используйте ISNULL, если вы не уверены в типе данных и его длине.

+0

Серьезный вопрос. В каком сценарии вы не знаете тип данных и длину в SQL? – UnhandledExcepSean

+0

@SpectralGhost Во-первых, позвольте мне ясно понять, что я не имею в виду не знать о типе данных. Я имею в виду, что значение во втором аргументе будет соответствовать длине данных, определенной для первого. Выше - просто простой пример. Если у вас есть какой-то другой столбец из какой-либо другой таблицы в качестве второго аргумента для 'ISNULL', то лучше, если вы сначала проверили длину данных или просто просто можете использовать' COALESCE'. И во многих случаях, например, когда ваша таблица создается с помощью 'SELECT * INTO' или во время некоторых строковых манипуляций, это трудно предсказать. – AgentSQL

1

Пока Auditlog является строкой, то что-то подобное должно работать:

select FirstName, 
CASE WHEN AuditLog IS NULL THEN 'Enabled' ELSE AuditLog END AS AuditLogEnabled 
from UserDetail 
where FirstName = 'test' 
3

Вы можете сделать это с делом, но в этой простой ситуации, я предпочитаю ISNULL()

select FirstName,AuditLog,ISNULL(AuditLog,'Enabled') AS AuditLogEnabled 
from UserDetail 
where FirstName = 'test'