【问题标题】:how to convert multiple comma separated strings into a table with several columns如何将多个逗号分隔的字符串转换为具有多列的表
【发布时间】:2020-09-19 08:46:32
【问题描述】:

我在数据库中有一个包含两列(ID、Asset)的表。现在我需要将元组列表(ID1、ID2、QTY)传递给存储过程,并按 QTY 减少 ID2 的资产并将其添加到 ID1。我想出将这些值作为三个逗号分隔的字符串传递,每个字符串中的元素数量具有相同的长度。然后我想解析这些字符串并将它们转换为临时表,最后进行所需的计算和更新。例如,使用以下输入 ID1:101,231,452,176 ID2:301,453,54,1265 数量:1000,2000,7412,6521 结果表应如下所示:

ID1 | ID2 |数量 -------------------- 101 | 301 | 1000 231 |第453章2000 第452章54 | 7412 176 |第1265章6521

【问题讨论】:

    标签: sql string csv stored-procedures db2


    【解决方案1】:

    你可以使用如下的“tokenizer”函数:

    select 
      id1.seq
    , id1.tok as id1
    , id2.tok as id2
    , qty.tok as qty
    from xmltable('for $id in tokenize($s, ",") return <i>{string($id)}</i>' 
    passing '101,231,452,176' as "s"
    columns 
      seq for ordinality
    , tok int path '.'
    ) id1
    join xmltable('for $id in tokenize($s, ",") return <i>{string($id)}</i>' 
    passing '301,453,54,1265' as "s"
    columns 
      seq for ordinality
    , tok int path '.'
    ) id2 on id2.seq = id1.seq 
    join xmltable('for $id in tokenize($s, ",") return <i>{string($id)}</i>' 
    passing '1000,2000,7412,6521' as "s"
    columns 
      seq for ordinality
    , tok int path '.'
    ) qty on qty.seq = id1.seq;
    

    结果是:

    |SEQ                 |ID1        |ID2        |QTY        |
    |--------------------|-----------|-----------|-----------|
    |1                   |101        |301        |1000       |
    |2                   |231        |453        |2000       |
    |3                   |452        |54         |7412       |
    |4                   |176        |1265       |6521       |
    

    在每个xmltable 内的passing 子句之后可以使用参数代替字符串常量。

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 2023-04-02
      • 2012-02-01
      • 2013-02-04
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      相关资源
      最近更新 更多