SQL:具有不同类型参数的ISNULL函数

时间:2011-11-01 07:36:10

标签: sql sql-server database sql-server-2008 isnull

在SQL Server中,ISNULL()函数必须具有相同类型的参数。

  

check_expression

     

是否要检查表达式是否为NULL。 check_expression可以是   任何类型。

     

replacement_value

     

如果check_expression为NULL,则返回表达式。   replacement_value 必须与check_expresssion 具有相同的类型。

如何将其与不同类型的参数一起使用?我希望使用datestring参数,例如ISNULL(A.DATE, '-')

注意A.DATE的类型为datetime

EDIT-1 :我的完整查询获得0行:

    SELECT A.pkey as KREDİ, A.SUMMARY , D.BayiStatu AS STATU, D.Sorumlu AS SORUMLU, C.BayiSonuc as SONUC, ISNULL( CONVERT(VARCHAR(25), A.CREATED, 112) , '-' ), ISNULL( CONVERT(VARCHAR(25), A.RESOLUTIONDATE, 112) , '-' ), dbo.CUSTVAL(11931, A.ID, 'S') AS BAYİ, ISNULL( CONVERT(VARCHAR(25), dbo.GetLastStatuTime(A.ID), 112) , '-' ) AS SON_STATU_TAR,j2.SUMMARY, ISNULL( CONVERT(VARCHAR(25), j2.CREATED, 112) , '-' ), ISNULL( CONVERT(VARCHAR(25), j2.RESOLUTIONDATE, 112) , '-' ), j3.SUMMARY, ISNULL( CONVERT(VARCHAR(25), j3.CREATED, 112) , '-' ), ISNULL( CONVERT(VARCHAR(25), j3.RESOLUTIONDATE, 112) , '-' )
FROM AspNetServicesDB.dbo.SONUC_MAP C, JİRA.resolution E, jira.issuestatus B, AspNetServicesDB.dbo.STATU_MAP D, Jira.jiraissue A
INNER JOIN Jira.issuelink i
    ON i.SOURCE = A.ID and i.SEQUENCE = 0
INNER JOIN Jira.jiraissue As j2
    ON i.DESTINATION =j2.ID 
LEFT JOIN Jira.issuelink i2 
    ON i2.SOURCE = A.ID  and i2.SEQUENCE = 1
LEFT JOIN Jira.jiraissue As j3 
    ON i2.DESTINATION = j3.ID
WHERE A.issuestatus = B.ID
AND 'BAŞARAN OTOMATİV' = dbo.CUSTVAL(11931, A.ID, 'S')
AND B.pname = D.JiraStatu collate Turkish_CS_AI
AND A.issuetype != 11
AND A.RESOLUTION = E.ID
AND E.pname = C.JiraSonuc collate Turkish_CS_AI

EDIT-2 :但这可行

select ISNULL( CONVERT(VARCHAR(25), A.RESOLUTIONDATE, 112) , '-' )
FROM Jira.jiraissue A

原因可能是JOIN

5 个答案:

答案 0 :(得分:4)

你做不到。 ISNULL函数本身用作查询结果列,或最终用作查询结果中的列的表达式。列中的所有字段/行必须具有相同的数据类型。所以你必须选择。

一种解决方案是将DATE转换为字符串,因此结果总是一个字符串,但我觉得最佳解决方案是为空日期返回NULL并让表示层决定是否或者不是NULL日期应显示为-以及应显示非空日期的格式(客户端区域设置)。

对于表示层,我指的是显示或输出此数据的任何内容,可以是网页,CSV导出器,报告工具等等。

答案 1 :(得分:4)

您可以简单地将日期转换为varchar吗?既然你的输出可能不是一个有效的日期,这应该可以正常工作:

ISNULL(CONVERT(varchar(10), A.Date, 101),'-')

答案 2 :(得分:3)

如果您真的需要-而不是null,则需要将日期转换为字符串。

declare @T table(adate datetime)
insert into @T values(null)
insert into @T values(getdate())

select isnull(convert(varchar(23), adate, 126), '-')
from @T

答案 3 :(得分:1)

您可以尝试:

 CASE WHEN A.DATE IS NULL
      THEN '-'
      ELSE CONVERT(VARCHAR(25), A.DATE, 112)
 END

答案 4 :(得分:1)

我会使用CONVERT/CAST将DATE值从[DATE]TIME转换为VARCHAR

SELECT ... ISNULL( CONVERT(VARCHAR(25), A.DATE, 112) , '-' ) AS DATE
FROM ...

可以使用另一种风格:103(dd / mm / yyyy),101(mm / dd / yyyy)或Date and Time Styles section中的其他风格,而不是112风格(yyymmdd)。