【问题标题】:Split one long comma string into multi column new table将一个长逗号字符串拆分为多列新表
【发布时间】:2013-06-12 18:15:53
【问题描述】:

我对 SQL 很陌生,请原谅我的无知。我有一个名为“temp”的表,其中包含一个带有一个长逗号分隔字符串的字段,因此:

Field1
Apples,oranges, pears, berries, melons

我想将上述内容插入到现有表中,即具有预定义列的“详细信息”,因此它看起来像这样:

Field1   Field2   Field3  Field4   Field5
Apples   Oranges  Pears   Berries  Melons 

我一直在阅读论坛,我认为我需要使用一个函数 - 但是我该怎么做呢?哪个功能最好?有人说 XML 函数最好?

问候,

迈克尔

【问题讨论】:

  • 您能添加您在哪个数据库引擎中执行此操作吗?
  • 这会破坏规范化。在继续之前,您应该了解所有不利后果。
  • 澄清 duffymo 的评论:应该(可能)为每个水果值有一个单独的记录,而不是一个记录有 5 个不同的列,每个列都有不同的水果。但是,您提出的结构仍然比在其中包含五个不同值的一个字段(用逗号分隔)要好。
  • 对不起 - SQL Server 2008

标签: sql sql-server string sql-server-2008


【解决方案1】:

试试这个

;WITH Split_Fields (Field, xmlfields)
AS
(
    SELECT Field1 AS Field,
    CONVERT(XML,'<Fields><field>'  
    + REPLACE(Field1,',', '</field><field>') + '</field></Fields>') AS xmlfields
      FROM Table1
)

 SELECT Field,      
 xmlfields.value('/Fields[1]/field[1]','varchar(100)') AS Field1,    
 xmlfields.value('/Fields[1]/field[2]','varchar(100)') AS Field2,
 xmlfields.value('/Fields[1]/field[3]','varchar(100)') AS Field3,    
 xmlfields.value('/Fields[1]/field[4]','varchar(100)') AS Field4,
 xmlfields.value('/Fields[1]/field[5]','varchar(100)') AS Field5
 FROM Split_Fields

SQLFiddle Demo

SELECT Field,
xmlfields.value('/Fields[1]/field[1]','varchar(100)') AS Field1, 
xmlfields.value('/Fields[1]/field[2]','varchar(100)') AS Field2, 
xmlfields.value('/Fields[1]/field[3]','varchar(100)') AS Field3, 
xmlfields.value('/Fields[1]/field[4]','varchar(100)') AS Field4, 
xmlfields.value('/Fields[1]/field[5]','varchar(100)') AS Field5 
FROM 
(
SELECT 
Field1 AS Field
,CONVERT(XML,'<Fields><field>' + REPLACE(Field1,',', '</field><field>') + '</field></Fields>') AS xmlfields 
FROM Table1
) Split_Fields

插入另一个表格(例如:详细信息)请尝试以下操作

;WITH Split_Fields (Field, xmlfields)
AS
( 
SELECT 
Field1 AS Field
,CONVERT(XML,'<Fields><field>' + REPLACE(Field1,',', '</field><field>') + '</field></Fields>') AS xmlfields 
FROM Table1
) 

INSERT INTO Detail
SELECT 
xmlfields.value('/Fields[1]/field[1]','varchar(100)') AS Field1, 
xmlfields.value('/Fields[1]/field[2]','varchar(100)') AS Field2, 
xmlfields.value('/Fields[1]/field[3]','varchar(100)') AS Field3, 
xmlfields.value('/Fields[1]/field[4]','varchar(100)') AS Field4, 
xmlfields.value('/Fields[1]/field[5]','varchar(100)') AS Field5 
FROM Split_Fields

【讨论】:

  • 谢谢 - 那么上面的函数是我需要创建的吗?我最终想通过存储过程使用报告服务 - 我如何从 SP 调用上述内容?
  • @user2470603 如果您有多行的逗号分隔列并且需要转换为多列,那么上面的查询可以完美运行。如果您有其他情况,请提供带有表结构的示例数据。
  • 道歉,但我迷路了。以上是我需要创建的功能吗?
  • 对不起,我对 SQL 很陌生,不明白。我将它粘贴到 SP 中,但在 WITH 语句中它说它期待 ')'
  • 如果您仍然收到错误,请将您的 SP 粘贴到您的问题中,以便我可以帮助您
【解决方案2】:

Oracle SQL:

SELECT  REPLACE(SUBSTR(r_str, 1, INSTR(r_str, ',', 1, 1) - 1), ' ') AS r_substr_1
,       REPLACE(SUBSTR(r_str, INSTR(r_str, ',', 1, 1) + 1, INSTR(r_str, ',', 1, 2) - INSTR(r_str, ',', 1, 1) - 1), ' ') AS r_substr_2
,       REPLACE(SUBSTR(r_str, INSTR(r_str, ',', 1, 2) + 1, INSTR(r_str, ',', 1, 3) - INSTR(r_str, ',', 1, 2) - 1), ' ') AS r_substr_3
,       REPLACE(SUBSTR(r_str, INSTR(r_str, ',', 1, 3) + 1, INSTR(r_str, ',', 1, 4) - INSTR(r_str, ',', 1, 3) - 1), ' ') AS r_substr_4
,       REPLACE(SUBSTR(r_str, INSTR(r_str, ',', 1, 4) + 1), ' ')    AS r_substr_5
FROM
(
        SELECT  'Apples, oranges, pears,berries, melons' r_str FROM DUAL
);

Result: Apples  oranges pears   berries melons

【讨论】:

    【解决方案3】:

    通常 sql 用于结构化数据,逗号分隔的字符串将来自外部数据文件。如果您有可用的外部数据文件,请像这样加载数据。或者,如果需要,可以考虑将原始临时表导出到数据文件。

    bulk insert tbl_fruits from file.csv with fieldterminator=','
    

    【讨论】:

      猜你喜欢
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多