如何在 DB2 中获取字符分隔的子字符串?
Posted
技术标签:
【中文标题】如何在 DB2 中获取字符分隔的子字符串?【英文标题】:How to get a character delimited substring in DB2? 【发布时间】:2021-05-06 10:19:52 【问题描述】:我的表“Employee”中有一个列“employee_Id”。
employee_Id 包含员工姓名和出生日期。例如:
Jason-21996
和 Buttler
请帮助我编写一个返回 Jason
和 Buttler
作为输出的选择查询。
这是我正在尝试的查询:
select substring(employee_Id,1, LOCATE('-',employee_Id) - 1) as Emp_ID from Employee
我看到了这个错误:
SQL Error [42815]: THE DATA TYPE, LENGTH, OR VALUE OF ARGUMENT 3 OF SUBSTRING IS INVALID. SQLCODE=-171, SQLSTATE=42815, DRIVER=4.9.78
编辑1:根据@Mark 的建议,我已将查询编辑如下
select substring(employee_Id,1, LOCATE('-',employee_Id || '-') - 1) as Emp_ID from Employee
我遇到了同样的错误。我尝试运行 LOCATE,发现它为 Buttler 返回索引为 15,因为列长度为 15。
【问题讨论】:
【参考方案1】:按原样运行以下命令。
select substring(employee_Id, 1, LOCATE('-', employee_Id || '-') - 1) as Emp_ID
from
(
SELECT 'Jason-21996' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'Buttler' FROM SYSIBM.SYSDUMMY1
) Employee (employee_Id);
它对你有用吗?
【讨论】:
【参考方案2】:如果您的 DB2 版本支持正则表达式,那么一个简单的方法是regexp_substr()
:
regexp_substr(employee_id, '^[^-]+')
Here 是一个 dbfiddle。
【讨论】:
SQL 错误 [42884]:未找到具有兼容参数的授权 REGEXP_SUBSTR。 SQLCODE=-440, SQLSTATE=42884, DRIVER=4.9.78 @VarshaKumari 您的查询有什么问题? @MarkBarinstein,我已经更新了有问题的错误,请看一下 某些employee_id
的值中可能没有“-”字符。试试substring(employee_Id, 1, LOCATE('-', employee_Id || '-') - 1)
。
@GordonLinoff REGEXP_SUBSTR 即使在 DB2 12 for Z/OS 中也可能不存在。根据链接,它必须在 FL504 才能启用。您提供的链接适用于 Db2 for LUW - 它是具有非常相似的 SQL 函数集的不同产品,但不是 100%。以上是关于如何在 DB2 中获取字符分隔的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章
使用字符分隔符在 C++ 中解析字符串,但在每个解析的子字符串中保留可重复的字符作为分隔符(C++ STL)
db2 对字符串进行分隔(分隔符为逗号),并计算分隔得到的数组的长度,不写自定义函数,如何做到?