2016-03-02 44 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