如何在 DB2 中获取字符分隔的子字符串?

Posted

技术标签:

【中文标题】如何在 DB2 中获取字符分隔的子字符串?【英文标题】:How to get a character delimited substring in DB2? 【发布时间】:2021-05-06 10:19:52 【问题描述】:

我的表“Employee”中有一个列“employee_Id”。

employee_Id 包含员工姓名和出生日期。例如:

Jason-21996Buttler

请帮助我编写一个返回 JasonButtler 作为输出的选择查询。

这是我正在尝试的查询:

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)

Java使用正则表达式提取字段分隔的子字符串

db2 对字符串进行分隔(分隔符为逗号),并计算分隔得到的数组的长度,不写自定义函数,如何做到?

JavaScript 字符串替换中的子匹配组引用是不是有分隔符/消歧语法?

如何在 Python 中获取字符串的子字符串?

如何在 PHP 中获取两个字符串之间的子字符串?