我在下面有一个名为" 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,那么它将适用于我提供的所有三个示例。
答案 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
强>
工作原理:
_
字符_
字符(添加CONCAT
以确保其存在INT
语法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 ║
╚════════════════════════════════╩════════╝