如何在不创建存储过程的情况下,在DB2中根据特定的分隔符将字符串拆分



我在DB2中有一个名为"Person_Info"的varchar列。我需要使用"_"分割它的值,并在DB2中获得第三个令牌。然后将其转换为整数。

Person_Info
----------------
Person_BILL_1234_1511011900
Person_BOB_88888
Person_MARIOSAN_10_1511011900

输出应为:

1234
88888
10

我已经阅读了这篇文章"如何在DB2中基于分隔符拆分字符串值"。它并不能真正解决这个特殊的案件。

我还检查了这篇文章——在DB2中拆分一个VARCHAR以检索里面的值,但它需要创建一个存储过程。我不能只是在生产环境中为一些实用程序函数创建一个存储过程。

目前,我已经尝试过:

Select INTEGER(
    SUBSTR(
        Person_Info, LOCATE('_', Person_Info, 10) + 1, 2
    )
) from PersonTable

但它只适用于"Person_MARIOSAN_10_1511011900"。

那么,有没有任何解决方案可以在不创建任何存储过程的情况下实现这一点呢?特别是如果解决方案不绑定到任何硬编码值(如10或2),那么它将适用于我提供的所有三个示例。

我没有访问DB2的权限来检查它,但它应该可以工作,或者很容易适应:

CREATE TABLE PersonTable(Person_Info VARCHAR(1000));
INSERT INTO PersonTable(Person_Info)
SELECT 'Person_BILL_1234_1511011900'  union all
SELECT 'Person_BOB_88888'  union all
SELECT 'Person_MARIOSAN_10_1511011900';

查询:

SELECT LEFT(sub.r, LOCATE('_', CONCAT(sub.r, '_'))-1) AS result
FROM (
  SELECT RIGHT(Person_Info, LENGTH(Person_Info) - 
                            LOCATE( '_',Person_Info, LOCATE('_', Person_Info)+1)) AS r
  FROM PersonTable
  ) AS sub

SqlFiddleDemo

工作原理:

  1. 在子查询中,我从第二个_字符开始获得权利
  2. 在主查询中,我得到下一个_字符的左边部分(添加CONCAT以确保它存在
  3. 如果需要,可以使用DB2语法将结果cas到INT

假设你一开始总是Person_

SELECT Person_Info,
 LEFT(RIGHT(Person_Info, LENGTH(Person_Info) - LOCATE('_', Person_Info, 8)),
            LOCATE('_', CONCAT(RIGHT(Person_Info, LENGTH(Person_Info) 
                                                - LOCATE('_', Person_Info, 8))
                        ,'_')
                  )-1)
           AS result
FROM PersonTable

SqlFiddleDemo2

输出:

╔════════════════════════════════╦════════╗
║          Person_Info           ║ result ║
╠════════════════════════════════╬════════╣
║ Person_BILL_1234_1511011900    ║   1234 ║
║ Person_BOB_88888               ║  88888 ║
║ Person_MARIOSAN_10_1511011900  ║     10 ║
╚════════════════════════════════╩════════╝

最新更新