2013-07-20 193 views
0

表[docSVdate]
PK SID,fielID
值的DateTime不爲空返回空字符串沒有匹配的日期時間

如果沒有行對於給定的PK(SID,fieldID)我需要返回空字符串
這是我能想到的最好
有沒有人有更有效的東西?

select isnull(convert(varchar,[docSVdate].[value]), '') 
    from [docSVsys] as [pholder] with (nolock) 
    left join [docSVdate] 
     on [docSVdate].[sID] = [pholder].[sID] 
    and [docSVdate].[fieldID] = 117 
    where [pholder].[sID] = 6485 

回答

2

如果轉換datetimevarchar在SQL中,您將引入您的SQL Server的語言和文化設置成日期字符串。您可能也正在失去精確度,具體取決於正在使用的格式。如果應用程序代碼解析字符串的方式不同於SQL生成的字符串,則可能會出現錯誤。

所以簡單的答案是 - 不要這樣做。只需返回它作爲datetime。讓調用應用程序直接使用它而不轉換爲字符串。在調用應用程序中檢查是否有必要。

如果你真的想要做到這一點,那麼有很多技術可以工作,包括你展示的加入,以及路易斯在他的回答中顯示的變量。這是另一種使用嵌套查詢的技術。也許這是你在找什麼:

SELECT ISNULL(
    (select convert(varchar, [value]) 
    from [docSVDate] 
    where [sID] = 6485 and [fieldID] = 117 
    ), '') as [value] 

請注意,轉化率從datetimevarchar涉及的格式,不管你喜歡還是不喜歡。如果你沒有指定任何東西,你會得到你正在運行的任何系統的默認值。對我來說,運行美國英語設置的數據庫時,我的默認格式看起來像"Jul 21 2013 4:41PM"但是如果我有不同的語言設置,我可能會得到完全不同的結果。你應該傳遞一個格式說明符來表示你正在尋找什麼樣的格式。請參考MSDN參考中的Date and Time Styles remarks進行投射/轉換。

+0

一點也不回答了規定的問題。 – Paparazzi

+0

它可能不是你正在尋找的答案,但它確實引起了一個應該考慮的問題的幽靈:你如何處理匹配的行?你關心這個值是否以字符串形式返回,或者你需要使用datetime嗎? –

+0

@Blam - 請提供所需日期/時間字符串格式的例子。 –

2

如果它只是一個行...

INNER JOIN? 我不知道什麼是執行計劃將顯示

DECLARE @Value VARCHAR(50) 
    SET @Value = '' 

    SELECT @Value = convert(varchar,[docSVdate].[value]) 
    FROM [docSVsys] as [pholder] with (nolock) 
    INNER JOIN [docSVdate] 
     ON [docSVdate].[sID] = [pholder].[sID] 
     AND [docSVdate].[fieldID] = 117 
    WHERE [pholder].[sID] = 6485 

    SELECT @Value as Value 

不需要加入的。
最多一行的哪裏是PK,

DECLARE @Value VARCHAR(50) 
    SET @Value = '' 

    SELECT @Value = convert(varchar,[docSVdate].[value]) 
    FROM [docSVdate]   
    WHERE [docSVdate].[sID] = 6485 
    AND [docSVdate].[fieldID] = 117 

    SELECT @Value as Value 
+0

根本不需要連接。我正在使用這個來建立一個更大的查詢,所以格式不適合,但它是光滑的。 – Paparazzi

+0

如果你確實不需要JOIN,那真的可能是最快的。 –

相關問題