【问题标题】:connect by level scenario in Db2在 Db2 中按级别连接场景
【发布时间】:2023-01-11 15:16:40
【问题描述】:

我在 DB2 中有一个场景,我有一个列值作为

从 id='02346' 的表中选择值

价值

1,2,3,4,5,6,7

我想使用 DB2 查询将上面的值转换为如下所示。

1个
2个
3个
4个
5个
6个
7

我怎样才能做到这一点?一世

使用 oracle 其完成如下。 测试为 (从双列中选择“421907802490;421907672085;421911460415;421905464170;421907802292”列) 选择 regexp_substr(col, '[^;]+', 1, level) 结果 从测试 按级别连接 <= length(regexp_replace(col, '[^;]+')) + 1;

【问题讨论】:

    标签: db2 websphere


    【解决方案1】:

    按原样运行。

    select x.tok
    from 
    -- uncomment this and comment out "(values ...) t (id, value)"
    -- table t
    (
     values ('02346', '1,2,3,4,5,6,7')
    ) t (id, value)
    , xmltable
    (
      'for $id in tokenize($s, ",") return <i>{string($id)}</i>' 
      passing 
        t.value as "s"
      columns 
        tok varchar(4000) path '.'
    ) x
    where t.id = '02346'
    
    TOK
    1
    2
    3
    4
    5
    6
    7

    fiddle

    【讨论】:

    • 这在 DB2 SQL 中不起作用。 SQL 错误 [42601]:非法符号“(”。一些可能合法的符号是:. <IDENTIFIER> JOIN INNER LEFT RIGHT FULL CROSS。SQLCODE=-104,SQLSTATE=42601,DRIVER=4.29.24
    • 您的 db2 版本和平台是什么?
    【解决方案2】:

    如果您在 LUW 上,使用相当新的版本并且可以启用 Oracle 兼容模式,那么您的查询可以开箱即用。试过:

    [db2inst1@db2server ~]$ db2set
    DB2_COMPATIBILITY_VECTOR=ORA
    
    
    [db2inst1@db2server ~]$ db2 "with test as (select '421907802490;421907672085;421911460415;421905464170;421907802292' col from dual) select regexp_substr(col, '[^;]+', 1, level) result from test connect by level <= length(regexp_replace(col, '[^;]+')) + 1"
    
    RESULT                                                          
    ----------------------------------------------------------------
    421907802490                                                    
    421907672085                                                    
    421911460415                                                    
    421905464170                                                    
    421907802292                                                    
    
      5 record(s) selected.
    

    测试:

    sudo docker pull ibmcom/db2
    sudo docker run ...
    sudo docker exec -it db2server bash
    su - db2inst1
    

    【讨论】:

      猜你喜欢
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 2019-05-22
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多