【问题标题】:CONCAT in SQL Server 2008 r3 [duplicate]SQL Server 2008 r3 中的 CONCAT [重复]
【发布时间】:2018-10-15 13:15:32
【问题描述】:

我必须连接几个字段来生成唯一键,为此我想组合 3 个具有不同数据类型的字段:integerdatestring

我在 SQL Server 2012 中使用的:

CONCAT(PMEOBJECT.OBJECTID, '-', PMEOBJECT.FROMDATE, '-', PMEBUILDING.NAME) AS OBJECTIDKEY

任何想法如何在 SQL Server 2008 中编写此代码?

编辑:还必须考虑 NULLS。 编辑:我在两者之间添加了 ISNULL(PMEOBJECT.FROMDATE, '') 以使其工作。谢谢大家。

【问题讨论】:

  • 您需要将非字符串转换为字符串,然后使用“+”连接它们。
  • 即使在 SQL Server 2012 中,您也不会为此使用 CONCAT,因为您真的不想依赖 DATE 的默认转换格式(可能因语言而异)。明确使用CONVERT
  • 为什么不直接使用代理键?
  • 请记住,CONCAT 会将 NULL 隐式转换为空字符串。使用 '+' 不会那样做。如果你使用 '+' 连接字符串,并且其中任何一个为 NULL,那么整个结果将为 NULL。
  • 非常感谢您的回复。现在我确实遇到了 NULL 的问题。我需要连接几列来创建一个唯一键,其中一些列具有 NULL 值。如何处理?

标签: sql sql-server tsql sql-server-2008 concat


【解决方案1】:

您可以使用“+”来连接列,但请记住将非字符串类型(intdate 等)转换为字符串类型(例如 varchar),否则会发生错误(因为SQL Sever 会尝试实际添加值):

select cast(PMEOBJECT.OBJECTID as varchar(50)) + '-' 
     + cast(PMEOBJECT.FROMDATE as varchar(50)) + '-'
     + PMEBUILDING.NAME as OBJECTIDKEY

对于date 列,您可能需要定义一种自定义格式,因此使用CONVERT 而不是CAST 可能会更好。

例如,要获取经典的yyyy-mm-dd hh:mi:ss ODBC 格式,您可以使用:

select cast(PMEOBJECT.OBJECTID as varchar(50)) + '-' 
     + convert(varchar(50), PMEOBJECT.FROMDATE, 120) + '-'
     + PMEBUILDING.NAME as OBJECTIDKEY

【讨论】:

  • Bad habits to kick : declaring VARCHAR without (length)。在这种情况下,它表示VARCHAR(30),但这一点也不明显。
  • @JeroenMostert 你是对的,谢谢你的建议。
  • 对于某些列来说很有意义并且它有效。但是我现在连接其中一些具有 NULL 值的列。 2008年如何在没有NULL覆盖整个列和其他值的情况下连接列?
  • @titatovenaar 发现 NULL 时会发生什么?应该出现一个空白 (objid--name) 还是应该删除连字符 (objid-name)?您能否在您的问题中添加一些示例?
  • 找到了答案,很抱歉再次提出这个问题。我使用:选择 cast(PMEBJECT.OBJECTID as varchar(50)) + '-' + cast(ISNULL(PMEOBJECT.FROMDATE, '') as varchar(50)) + '-' + PMEBUILDING.NAME as OBJECTIDKEY
【解决方案2】:

在使用“+”时你也可能遇到类型问题,尽管有时你必须使用 convert(varchar, expression) :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2012-02-15
    • 2017-09-07
    • 2015-02-26
    • 1970-01-01
    • 2012-12-18
    • 2014-01-25
    相关资源
    最近更新 更多