使用ISNULL和计算列的SQL查询不返回结果

时间:2014-01-09 06:17:30

标签: sql-server

我在Sql 2012中有这个查询:

  

SELECT Id,Periodo,Due,Paid,Balance,Expenses,Notes,Completato,   Data_pag,Ritardo来自dbo.affitto_sa

哪个正常工作并按照图片的上半部分返回数据:

enter image description here

我现在尝试用系统日期(现在)替换Data_pag列中的空值。 我尝试过这个查询,它返回图片底部的数据:

  

SELECT Id,Periodo,Due,Paid,Balance,Expenses,Notes,Completato,   ISNULL(Data_pag,SYSDATETIME()),Ritardo来自dbo.affitto_sa

我遇到的问题是列名“Data_pag”消失,即使正确替换空值,也不会计算“Ritardo”列中的值。此列“Ritado”具有以下计算公式“(datediff(day,[Data_pag],[Periodo]))”并设置为持久性。 如何解决这两个问题:列名并获取计算表达式的结果?

2 个答案:

答案 0 :(得分:1)

您需要使用alias

 SELECT Id, Periodo, Due, Paid, Balance, 
 Expenses, Notes, Completato, ISNULL(Data_pag, SYSDATETIME()) as Data_pag, 
 datediff(day,isnull(Data_pag,SYSDATETIME()),Periodo) as Ritardo 
 FROM dbo.affitto_sa

您无法在同一查询中引用计算机列。要么使用派生查询,要么只为其他列使用相同的计算表达式

datediff(day,isnull(Data_pag,SYSDATETIME()),periodo)

Select a.*,
datediff(day,Data_pag,Periodo) as Ritardo 
from 
(
 SELECT Id, Periodo, Due, Paid, Balance, 
 Expenses, Notes, Completato, ISNULL(Data_pag, SYSDATETIME()) as Data_pag, 
 Ritardo
 FROM dbo.affitto_sa
 )a

答案 1 :(得分:0)

使用ISNULL()函数时,列名称不再存在。您需要定义新的列名称。

关于您的第二个问题,您需要将[Data_pag]替换为从ISNULL()处理的值

SELECT Id, Periodo, Due, Paid, Balance,
Expenses, Notes, Completato, 
ISNULL(Data_pag, SYSDATETIME()) as Data_pag, 
(datediff(day,ISNULL(Data_pag, SYSDATETIME()),[Periodo])) as Ritardo 
 FROM dbo.affitto_sa