如何在不创建存储过程的情况下基于DB2中的某个分隔符拆分字符串

时间:2015-11-01 09:19:47

标签: sql string stored-procedures db2

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

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

输出应为:

1234
88888
10

我已查看此帖子How to split a string value based on a delimiter in DB2。它并没有真正解决这个特殊情况。

还检查过这篇文章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,那么它将适用于我提供的所有三个示例。

1 个答案:

答案 0 :(得分: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. 开始
  3. 在主要查询中,我将左侧部分留给下一个_字符(添加CONCAT以确保其存在
  4. 如果需要,您可以使用INT语法
  5. 将结果转换为DB2

    假设您在开始时总是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 ║
    ╚════════════════════════════════╩════════╝