如何在不创建存储过程的情况下根据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
工作原理:
- 在子查询中,我从第二个
_
字符开始得到正确的
- 在主查询中,我得到下一个
_
字符的左边部分(添加 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
输出:
╔════════════════════════════════╦════════╗
║ Person_Info ║ result ║
╠════════════════════════════════╬════════╣
║ Person_BILL_1234_1511011900 ║ 1234 ║
║ Person_BOB_88888 ║ 88888 ║
║ Person_MARIOSAN_10_1511011900 ║ 10 ║
╚════════════════════════════════╩════════╝
我在 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
工作原理:
- 在子查询中,我从第二个
_
字符开始得到正确的 - 在主查询中,我得到下一个
_
字符的左边部分(添加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
输出:
╔════════════════════════════════╦════════╗
║ Person_Info ║ result ║
╠════════════════════════════════╬════════╣
║ Person_BILL_1234_1511011900 ║ 1234 ║
║ Person_BOB_88888 ║ 88888 ║
║ Person_MARIOSAN_10_1511011900 ║ 10 ║
╚════════════════════════════════╩════════╝