如何在不创建存储过程的情况下根据DB2中的某个定界符拆分字符串

How to split string in based on a certain delimiter in DB2 without creating stored procedure

我在 DB2 中有一个名为 "Person_Info" 的 varchar 列。我需要使用“_”拆分它的值并在 DB2 中获取第三个标记。然后将其转换为整数。

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

输出应该是:

1234
88888
10

我检查过这个 post How to split a string value based on a delimiter in DB2。它并没有真正解决这个特殊情况。

也检查了这个 post Split a VARCHAR in DB2 to retrieve a value inside,但它需要创建一个存储过程。我不能只在生产环境中为某些实用函数创建存储过程。

目前我尝试过:

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 ║
╚════════════════════════════════╩════════╝