2013-07-20 165 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,那真的可能是最快的。 –

相关问题