如何在Sybase中利用regexp、substr、instr实现字符串拆分并生成指定结果?
Sybase 中拆分字符串列的实现方案
问题场景
现有数据表结构及数据如下:
| row_num | desc |
|---|---|
| 1 | First Name/Last Name - Middle Name |
| 2 | FirstName/LastName - MiddleName |
| 3 | FirstName/LastName |
需要将desc列拆分为desc_1、desc_2、desc_3三列,得到如下结果:
| row_num | desc_1 | desc_2 | desc_3 |
|---|---|---|---|
| 1 | First Name | Last Name | Middle Name |
| 2 | FirstName | LastName | MiddleName |
| 3 | FirstName | LastName | NULL |
注意:Sybase 中无法使用类似SUBSTR(desc,INSTR(desc,' ',1,1) + 1)的嵌套写法,需通过regexp、substr、instr实现。
解决方案
方法一:结合 INSTR 和 SUBSTR 分步拆分
利用分隔符/和-定位拆分位置,通过分步提取实现需求:
SELECT row_num, -- 提取desc_1:从开头到第一个'/'的位置 SUBSTR(desc_col, 1, INSTR(desc_col, '/') - 1) AS desc_1, -- 提取desc_2:从'/'后到' - '的位置,无' - '则取到末尾 CASE WHEN INSTR(desc_col, ' - ') > 0 THEN SUBSTR(desc_col, INSTR(desc_col, '/') + 1, INSTR(desc_col, ' - ') - INSTR(desc_col, '/') - 1) ELSE SUBSTR(desc_col, INSTR(desc_col, '/') + 1) END AS desc_2, -- 提取desc_3:从' - '后开始,无该分隔符则返回NULL CASE WHEN INSTR(desc_col, ' - ') > 0 THEN SUBSTR(desc_col, INSTR(desc_col, ' - ') + 3) ELSE NULL END AS desc_3 FROM your_table;
说明:
- 将原列名
desc改为desc_col,避免与Sybase关键字冲突INSTR(desc_col, ' - ') + 3是因为分隔符-占3个字符(空格+减号+空格)- 通过
CASE语句兼容无中间名(无-分隔符)的场景
方法二:使用正则表达式拆分(Sybase ASE 15.7+ 支持)
若你的Sybase版本支持正则表达式函数REGEXP_SUBSTR,可通过正则匹配更简洁地提取:
SELECT row_num, REGEXP_SUBSTR(desc_col, '^[^/]+') AS desc_1, REGEXP_SUBSTR(desc_col, '/([^-]+)( - |$)', 1, 1, 'c', 1) AS desc_2, REGEXP_SUBSTR(desc_col, ' - ([^$]+)$', 1, 1, 'c', 1) AS desc_3 FROM your_table;
说明:
^[^/]+:匹配开头到第一个/前的所有字符,对应desc_1/([^-]+)( - |$):匹配/后到-或末尾的部分,捕获组1即为desc_2- ([^$]+)$:匹配-后到末尾的部分,捕获组1即为desc_3;无该分隔符时返回NULL
内容的提问来源于stack exchange,提问作者Bruce
相关产品推荐
相关产品推荐

