代码之家  ›  专栏  ›  技术社区  ›  MAW74656

在SQL中,如何将一条记录输出为一个用逗号分隔的字符串?

  •  0
  • MAW74656  · 技术社区  · 14 年前

    我使用的是SQL Server 2000,希望从该表中返回如下字符串:

    Field1 | Field2 | Field3  
    
    ABC    |  123   | abc  
    DEF    |  456   | def
    

    所需输出:
    ABC,123,ABC公司
    “定义,456,定义”

    我相信我可以通过简单的连接来做到这一点,但感觉很混乱。最好的方法是什么?

    注意:这是一个简单的例子,实际使用有9个+字段,可能有空。

    5 回复  |  直到 14 年前
        1
  •  1
  •   KM.    14 年前

    尝试:

    select
        '"'
            +ISNULL(CONVERT(varchar(1000),Field1),'null')
            + ',' + ISNULL(CONVERT(varchar(1000),Field2),'null')
            + ',' + ISNULL(CONVERT(varchar(1000),Field3),'null') 
            +'"' AS ResultColumn
        from MyTable
    

    调整一下 1000 在每个 CONVERT(varchar(1000), 必要时

        2
  •  1
  •   Ta01    14 年前

    你可以用 coalesce 或者像你提到的那样简单的连接。

    选择Field1+'、'+Field2+'、'+Field3

    当心空值,如果Field1、2或3为空,您将得到一个空结果,此行为可以是 changed 但不推荐。

        3
  •  1
  •   Gabriel Magana    14 年前

    嗯,为什么你要寻找一个比串联更复杂的答案?如果您想要“更干净”的东西,那么在调用DB服务器的代码中进行连接,这样您就不会将CPU负担放在服务器上进行连接。

    有一件事没有人提到过,总是回来咬人的屁股是,如果你的分隔符(逗号)包含在一个数据字段,那么你会有额外的逗号,你的数据将是含糊不清的。(即“a、b、c、d”是包含三个字段还是四个字段?如果第二个字段实际包含“b,c”,则导出格式不正确)。

    随着时间的推移,CSV格式的应用略有不同,因此没有标准的方法来处理这种情况。我个人更喜欢的处理方法是给字段值赋引号,然后通过重复它们来转义引号。例如,您有一个包含以下数据的记录:

    字段1:abc

    字段2:def“1

    字段3:12,“”3,b

    CSV记录将写为:

    "abc","def""1","12,""""3,b"
    

    这种格式避免了字段数据中所有可能的歧义。

    解析它是简单的,也是确定的。另一种选择是使用字段分隔符,您认为它永远不会出现在实际的字段数据中。这是一个快速的处理方法,但是在你的程序中留下了一个定时炸弹,让另一个程序员稍后修复:-)

    编辑:如果您不打算读取数据,那么,当然,您应该看到读取数据的程序如何处理导入数据,该数据包含分隔符字符,作为不应解释为字段分隔符的字段数据的一部分。

        4
  •  0
  •   Will Marcouiller    14 年前

    最简单的是连接。记住,为了理解、可读性和可维护性,保持它的简单性。不需要聪明的代码。

    select (Field1 + ',' + Field2 + ',' + Field3) as result
        from MyTable
    

    这里有一个链接: http://msdn.microsoft.com/en-us/library/aa276862(SQL.80).aspx

    备注

    连接空值时,concat null产生sp_dboption的空设置,或SET concat_null_产生确定一个表达式为空时的行为。如果concat null yiels null或SET concat_null_yiels_null启用,则“string”+null返回null。如果concat null产生null或SET concat_null_yields_null被禁用,则结果为“string”。

        5
  •  0
  •   Ashok Gupta    14 年前

    从表1中选择COALESCE(Field1,'''''''')+','+COALESCE(Field2,''''''''')+','+COALESCE(Field3,'''''''''''''''''