2016-03-02 45 views
2

我在SQL中使用CASE这个奇怪的遭遇2014年SQL CASE错误输出

这是我的查询:

SELECT (CASE WHEN dbo.GetFunctionAge(C.Birthdate) = 0 
       THEN '' ELSE dbo.GetFunctionAge(C.Birthdate) 
      END) AS Age 
     ,dbo.GetFunctionAge(C.Birthdate) 
     ,c.Birthdate 
FROM Client C 
WHERE ClientID = '34d0d845-e3a6-4078-8936-953ff3378eac' 

这是输出:

enter image description here

这里GetFunctionAge函数,如果你可能会问。

IF EXISTS (
    SELECT * 
    FROM dbo.sysobjects 
    WHERE ID = OBJECT_ID(N'[dbo].[GetFunctionAge]') AND 
     xtype in (N'FN', N'IF', N'TF')) 
DROP FUNCTION [dbo].[GetFunctionAge] 

GO 

CREATE FUNCTION [dbo].[GetFunctionAge](@BirthDate DATETIME) 
RETURNS INT 
AS 
BEGIN 

DECLARE @Age INT 

IF(@BirthDate = '1753-01-01 00:00:00.000') 
BEGIN 
    SET @Age = 0 
END 
ELSE 
BEGIN 
    SET @Age = DATEDIFF(hour,@BirthDate,GETDATE())/8766 
END 

RETURN @Age 
END 
GO 

问:
为什么在我的输出列年龄是0这应该是''
我加(No column name)表明其输出0所以从我的情况下,我的病情预期输出基地为''0 我没有收到有关数据,所以为什么行为的情况下这样的不一致的错误?

感谢那些能够向我澄清这一点的人。

+3

为什么 '1753年1月1日00:00:00.000'?改为使用NULL。 – jarlh

+1

如果你用'-1'代替'''会发生什么? –

+2

您正在从@Age的dbo.GetFunctionAge(C.Birthdate)返回一个Int值。因此,当您在case语句中使用它时,它也会返回一个int值。 ''变为0. – Kim

回答

2

你可以cast它到varchar所以你可以返回' '

SELECT (CASE WHEN dbo.GetFunctionAge(C.Birthdate) = 0 
       THEN '' ELSE Cast(dbo.GetFunctionAge(C.Birthdate) as varchar(5)) 
      END) AS Age 
     ,dbo.GetFunctionAge(C.Birthdate) 
     ,c.Birthdate 
FROM Client C 
WHERE ClientID = '34d0d845-e3a6-4078-8936-953ff3378eac' 

但如果你想保持你的Age column数据类型int

你可以只使用NULL代替' '

+0

我将这个答案作为最简单,最短的工作解决方案。施放是我的问题的答案。 – bot

3
SELECT 
     (CASE 
      WHEN a.ageint = 0 THEN '' 
      ELSE cast(a.ageint as varchar(3)) 
     END) AS Age 
    , a.ageint 
    , c.Birthdate 
FROM Client as C 
     CROSS APPLY (
      SELECT 
        ISNULL(dbo.GetFunctionAge(C.Birthdate), 0) AS ageint 
    ) AS a 
WHERE ClientID = '34d0d845-e3a6-4078-8936-953ff3378eac' 
; 
+0

感谢您的答案。所以铸造是解决我的问题。但是与另一个相比它有点长。我认为交叉应用不再需要,因为GetFunctionAge函数永远不会返回空值。但它是一个很好的做法,总是检查与空谢谢 – bot

+1

是的,铸造到一个字符串是必要的,因为你在该列中使用''''。交叉应用的目的是为了避免重复调用该函数。使用'isnull'或'coalesce'是可选的,但如果返回结果为NULL,那么你可能需要使用'outer apply'。顺便说一下:“sql的长度”并不是衡量质量的好方法,但总之并不总是好的(反之亦然)。 –

+0

哦,是的,我没有注意到它。你用它来避免重复的呼叫。做这样的事情是一个好习惯吗?对不起,即时通讯不是那么熟悉,但有交叉应用它比其他答案快吗?何时返回结果? – bot