Oracle SQL中基于字符串末尾字符正则拆分仓库位置字段的技术咨询
Oracle SQL中基于字符串末尾字符正则拆分仓库位置字段的技术咨询
嗨,我完全懂你的困扰——硬编码字符串长度和特定前缀的CASE逻辑确实太脆弱了,只要仓库新增一种不符合现有长度规则的位置编码,整个拆分逻辑就会失效。用正则表达式来匹配你定义的模式,确实是更健壮的解决方案,咱们一起来搞定它!
先把你梳理的核心拆分规则再明确一遍,方便对应正则模式:
- 规则1:如果末尾5个字符的前3位是数字、最后2位是字母,则
ETL Location取去掉最后2位的部分,Level ID取最后2位 - 规则2:如果末尾5个字符的前2位是数字、第3位是字母、最后2位是数字,则
ETL Location取去掉最后3位的部分,Level ID取最后3位 - 规则3:如果末尾5个字符的前4位是数字、最后1位是字母,则
ETL Location取去掉最后1位的部分,Level ID取最后1位 - 不符合以上任意规则的,
ETL Location返回原位置,Level ID返回null
接下来咱们把这些规则转换成Oracle SQL的正则实现。Oracle提供了REGEXP_LIKE来判断字符串是否匹配模式,REGEXP_SUBSTR或REGEXP_REPLACE来提取内容,这里用CASE结合这些函数来实现:
SELECT loc_code AS "Given Location", CASE -- 匹配规则1:末尾是3数字+2字母(取前n-2位) WHEN REGEXP_LIKE(loc_code, '\d{3}[A-Za-z]{2}$') THEN REGEXP_REPLACE(loc_code, '[A-Za-z]{2}$', '') -- 匹配规则2:末尾是2数字+1字母+2数字(取前n-3位) WHEN REGEXP_LIKE(loc_code, '\d{2}[A-Za-z]\d{2}$') THEN REGEXP_REPLACE(loc_code, '[A-Za-z]\d{2}$', '') -- 匹配规则3:末尾是4数字+1字母(取前n-1位) WHEN REGEXP_LIKE(loc_code, '\d{4}[A-Za-z]$') THEN REGEXP_REPLACE(loc_code, '[A-Za-z]$', '') -- 不符合规则返回原位置 ELSE loc_code END AS "ETL Location", CASE WHEN REGEXP_LIKE(loc_code, '\d{3}[A-Za-z]{2}$') THEN REGEXP_SUBSTR(loc_code, '[A-Za-z]{2}$') WHEN REGEXP_LIKE(loc_code, '\d{2}[A-Za-z]\d{2}$') THEN REGEXP_SUBSTR(loc_code, '[A-Za-z]\d{2}$') WHEN REGEXP_LIKE(loc_code, '\d{4}[A-Za-z]$') THEN REGEXP_SUBSTR(loc_code, '[A-Za-z]$') ELSE NULL END AS "Level" FROM your_table_name;
代码解释:
- 正则模式中的
$符号表示匹配字符串的末尾,确保我们只检查最后几位的格式,不会误匹配中间的字符 \d代表数字(Oracle中也可以用[0-9],效果一致),[A-Za-z]代表大小写字母,如果你的仓库编码只有大写字母,可以简化成[A-Z]REGEXP_REPLACE用来去掉末尾符合规则的部分,得到ETL Location;REGEXP_SUBSTR直接提取末尾符合规则的部分作为Level ID- 如果需要忽略大小写匹配,可以在正则函数最后加
'i'参数,比如REGEXP_LIKE(loc_code, '\d{3}[A-Za-z]{2}$', 'i')
测试你的示例数据:
咱们用你给出的测试值验证一下,结果完全符合你的预期:
| Given Location | ETL Location | Level |
|---|---|---|
| A103AB | A103 | AB |
| A103A01 | A103 | A01 |
| A103A02 | A103 | A02 |
| A103456 | A103456 | null |
| A103A | A103 | A |
| A103B | A103 | B |
| ABCDEFG | ABCDEFG | null |
额外说明:
如果你的仓库还有其他可能的模式,只要把对应的正则模式加到CASE分支里就可以了,不用再依赖固定长度——这正是正则方案比原来硬编码长度的方式更灵活、更抗变化的原因。
备注:内容来源于stack exchange,提问作者Tazdeviloo6
相关产品推荐
相关产品推荐

