我在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
工作原理:
- 在子查询中,我从第二个
_
字符开始获得权利 - 在主查询中,我得到下一个
_
字符的左边部分(添加CONCAT
以确保它存在 - 如果需要,可以使用
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 ║
╚════════════════════════════════╩════════╝