我有一个临时表,我的列total_amount
之一是整数类型而不是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
我在我的其他方面面临问题。
答案 0 :(得分:17)
您可以使用COALESCE函数自动将空值返回为0.语法如下所示:
SELECT COALESCE(total_amount, 0) from #Temp1
答案 1 :(得分:3)
当有多个列[和] / [或]值并且您想要第一个时,coalesce()是最佳解决方案。但是,在线查看书籍时,查询优化会将其转换为案例陈述。
MSDN摘录
COALESCE表达式是CASE表达式的语法快捷方式。
也就是说,代码COALESCE(expression1,... 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
答案 2 :(得分:1)
在所有情况下,您应该始终返回相同的类型:
在第一个中你有一个角色,而在另一个你有一个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
答案 3 :(得分:1)
在sql server中替换NULL的不同方法
使用:
替换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
答案 4 :(得分:1)
将空值替换为空:ISNULL('Value','')
将空值替换为0:ISNULL('Value',0)
答案 5 :(得分:0)
试试这个
SELECT Title from #Movies
SELECT CASE WHEN Title = '' THEN 'No Title' ELSE Title END AS Titile from #Movies
OR
SELECT [Id], [CategoryId], ISNULL(nullif(Title,''),'No data') as Title, [Director], [DateReleased] FROM #Movies