2016-06-21 95 views
-2
CAST(c.CNumber AS VARCHAR(2)) + '.' 
      + CAST(cc.Card AS VARCHAR(2)) + '.' 
      + CAST(CASE WHEN ce1.Id IS NOT NULL 
        THEN ISNULL(cerp.CERP, ' ') 
        ELSE ISNULL(cpa.Port, ' ') 
       END AS VARCHAR(2)) AS [IDPool] 

假設CNumber是3,Card是50,此查詢的顯示將是3.50.0問題是我需要找到一種方法來覆蓋數據類型優先級和ISNULL和COALESCE中存在的第一個列出的變量限制。我不能讓最後一個數字爲0,我需要它不顯示任何內容。我試過鑄造無濟於事。也許這是不可能做到的?ISNULL(int,'')空字符串返回0,有沒有辦法重寫?

編輯 - 道歉,第一篇文章,我看了別處。

如果ce1.Id不爲空,那麼如果cerp.CERP爲空,我需要傳遞一個空字符串,所以結果應該是,假設3.50。但是因爲ISNULL採用了第一個傳遞參數的數據類型(在這種情況下是int),它將該空字符串轉換爲0,結果爲3.50.0問題是我不能讓它在結尾處爲0

+2

呃,什麼?,你實際需要什麼結果? – Lamak

+0

所以你想'3.5'或'3.50'或'3.50.'?我很困惑。 – BJones

+0

即使有一點清楚的解釋也會在很長的時間裏得到答案。 –

回答

0

你需要轉換ISNULL函數,而不是功能的外內的參數值,以便函數的結果類型是你想要的類型。另外,如果您不希望在值爲空時顯示句點,則可以在ISNULL函數中包含字符串連接,以便它們消失。

declare @CNumber as int = 3 
declare @Card as int = 50 
declare @Id as int 
declare @CERP as int 
declare @Port as int 

select 
    CAST(@CNumber AS VARCHAR(2)) + '.' 
     + CAST(@Card AS VARCHAR(2)) 
     + CASE WHEN @Id IS NOT NULL 
       THEN ISNULL('.' + cast(@CERP as varchar(2)), '') 
       ELSE ISNULL('.' + cast(@Port as varchar(2)), '') 
      END AS [IDPool] 
+0

感謝您的幫助,這樣做的竅門,ISNULL只需要兩個參數,所以我甚至不想在函數內連接。對這個問題抱歉不清,再次感謝! – Maxwell

+0

沒問題;樂意效勞!是的,你可以使用表達式作爲函數的參數,但不能使用存儲過程。歡迎來到SO :)如果您發現有用的答案,您可以點擊旁邊的複選框將其標記爲讓人知道它對您有幫助的可接受答案。 –

1

我想我明白了......在互聯網的這一邊肯定不是很清楚。

CAST(c.CNumber AS VARCHAR(2)) + '.' 
      + CAST(cc.Card AS VARCHAR(2)) + '.' 
      + CAST(CASE WHEN ce1.Id IS NOT NULL 
        THEN ISNULL(convert(varchar(2), cerp.CERP), ' ') 
        ELSE ISNULL(convert(varchar(2), cpa.Port), ' ') 
       END AS VARCHAR(2)) AS [IDPool] 
+0

這是我如何理解這個問題。 – BJones

相關問題