表[docSVdate]
PK sID,fielID
value DateTime not null
如果给定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
答案 0 :(得分:2)
如果在SQL中将datetime
转换为varchar
,则会将SQL Server的语言和区域性设置引入日期字符串中。您可能也会失去精度,具体取决于所使用的格式。如果应用程序代码以不同于SQL生成它的方式解析字符串,则可能会出错。
所以简单的答案是 - 不要这样做。只需将其作为datetime
返回。让调用应用程序直接使用它而不转换为字符串。如果需要,在调用应用程序中检查null。
如果真的想要这样做,那么有许多技术可能会起作用,包括你展示的连接,以及Luis在他的回答中显示的变量。这是另一种使用嵌套查询的技术。也许这就是你要找的东西:
SELECT ISNULL(
(select convert(varchar, [value])
from [docSVDate]
where [sID] = 6485 and [fieldID] = 117
), '') as [value]
请注意,从datetime
到varchar
的转换涉及格式化,无论您是否喜欢。如果未指定任何内容,则会获得正在运行的任何系统的默认值。对我来说,在使用美国英语设置的数据库上运行时,我的默认格式看起来像"Jul 21 2013 4:41PM"
但是如果我有不同的语言设置,我可能会得到完全不同的结果。您应该传递格式说明符以指示您要查找的格式。请参阅MSDN参考中的Date and Time Styles remarks以进行强制转换。
答案 1 :(得分: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