Ответ 1
Вы можете использовать функцию COALESCE для автоматического возврата нулевых значений как 0. Синтаксис показан ниже:
SELECT COALESCE(total_amount, 0) from #Temp1
У меня есть временная таблица и в том, что один из моих столбцов total_amount
имеет целочисленный тип и NOT NULL
. При запросе данных я получил NULL
значения для столбца total_amount
.
Как бы то ни было, я использовал следующий синтаксис для удаления нулей, но некоторые, как появляются значения NULL, исправьте меня, если я ошибаюсь.
Create table #Temp1
(
issue varchar(100) NOT NULL,
total_amount int NOT NULL
)
Это мой запрос
Case when total_amount = 0 then 0
else isnull(total_amount, 0)
end as total_amount
Я столкнулся с проблемой в моей другой части.
Вы можете использовать функцию COALESCE для автоматического возврата нулевых значений как 0. Синтаксис показан ниже:
SELECT COALESCE(total_amount, 0) from #Temp1
Coalesce() - лучшее решение, когда есть несколько столбцов [и]/[или], и вы хотите первый. Однако, глядя на книги в режиме онлайн, оптимизация запроса преобразует его в оператор case.
Выдержка MSDN
Выражение COALESCE является синтаксическим ярлыком для выражения CASE.
То есть код COALESCE (выражение1,... n) переписывается оптимизатором запросов как следующее выражение CASE:
CASE
WHEN (expression1 IS NOT NULL) THEN expression1
WHEN (expression2 IS NOT NULL) THEN expression2
...
ELSE expressionN
END
С учетом сказанного, почему бы не просто ISNULL()? Меньше кода = лучшее решение?
Вот полный фрагмент кода.
-- drop the test table
drop table #temp1
go
-- create test table
create table #temp1
(
issue varchar(100) NOT NULL,
total_amount int NULL
);
go
-- create test data
insert into #temp1 values
('No nulls here', 12),
('I am a null', NULL);
go
-- isnull works fine
select
isnull(total_amount, 0) as total_amount
from #temp1
И последнее, но не менее важное: как получить нулевые значения в столбце NOT NULL?
Мне пришлось изменить определение таблицы, чтобы я мог настроить тестовый сценарий. Когда я пытаюсь изменить таблицу на NOT NULL, она терпит неудачу, так как она выполняет проверку недействительности.
-- this alter fails
alter table #temp1 alter column total_amount int NOT NULL
Вы всегда должны возвращать один и тот же тип во всех случаях:
В первом случае у вас есть символ, а на другом - int.
Вы можете использовать:
Select convert(varchar(11),isnull(totalamount,0))
или если вы хотите с вашим решением:
Case when total_amount = 0 then '0'
else convert(varchar(11),isnull(total_amount, 0))
end as total_amount
Заменить нулевые значения как пустые: ISNULL('Value','')
Заменить нулевые значения как 0: ISNULL('Value',0)
Попробуйте это
SELECT Title from #Movies
SELECT CASE WHEN Title = '' THEN 'No Title' ELSE Title END AS Titile from #Movies
ИЛИ
SELECT [Id], [CategoryId], ISNULL(nullif(Title,''),'No data') as Title, [Director], [DateReleased] FROM #Movies
Различные способы замены NULL на сервере sql
Замена значения NULL с помощью:
1. Функция ISNULL()
2. Функция COALESCE()
3. Заявление CASE
SELECT Name as EmployeeName, ISNULL(Bonus,0) as EmployeeBonus from tblEmployee
SELECT Name as EmployeeName, COALESCE(Bonus, 0) as EmployeeBonus
FROM tblEmployee
SELECT Name as EmployeeName, CASE WHEN Bonus IS NULL THEN 0
ELSE Bonus END as EmployeeBonus
FROM tblEmployee