0

Table [docSVdate]
PK sID, fielID
value DateTime not null

If there is no row for a given PK (sID, fieldID) I need to return an empty string
This is the best I could come up with
Does anyone have something more efficient?

  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
4

2 回答 2

2

如果只有一排...

内部联接?我不确定执行计划会显示什么

  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
于 2013-07-21T18:04:50.853 回答
2

如果在 SQL 中将 转换datetime为 a varchar,则将 SQL Server 的语言和文化设置引入日期字符串。您可能还会丢失精度,具体取决于所使用的格式。如果应用程序代码解析字符串的方式不同于 SQL 生成的字符串,则可能会出错。

所以简单的答案是——不要这样做。只需将其作为datetime. 让调用应用程序直接使用它而不转换为字符串。如有必要,在调用应用程序中检查 null。

如果你真的想这样做,那么有很多技术可能会起作用,包括你展示的连接,以及 Luis 在他的回答中展示的变量。这是另一种使用嵌套查询的技术。也许这就是您正在寻找的:

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

请注意,从datetimeto转换varchar涉及格式化,无论您喜欢与否。如果您不指定任何内容,您将获得您正在运行的任何系统的默认值。对我来说,在具有美国英语设置的数据库上运行,我的默认格式看起来像"Jul 21 2013 4:41PM" 但是如果我有不同的语言设置,我可能会得到完全不同的结果。您可能应该传递一个格式说明符来指示您要查找的格式。请参考 MSDN 参考中的日期和时间样式备注以进行转换/转换。

于 2013-07-20T17:53:35.473 回答