Databricks SQL:如何验证含短横线的字符串分段是否在有效值列表
解决Databricks SQL中含内部短横线的三段式字符串拆分验证问题
核心思路是:既然字符串是严格的三段结构(哪怕后两段内部有短横线),那我们只需要定位第一个短横线和最后一个短横线的位置,就能准确拆分出三段内容,不用管中间有多少短横线。
步骤1:拆分三段字符串
用Databricks SQL自带的字符串函数就能实现,示例SQL如下(假设目标表是data_table,待处理字段是target_string):
SELECT target_string, -- 提取第一段:从开头到第一个短横线之前的内容 SUBSTR(target_string, 1, INSTR(target_string, '-') - 1) AS substring1, -- 提取第二段:第一个短横线之后,到最后一个短横线之前的内容 SUBSTR( target_string, INSTR(target_string, '-') + 1, LENGTH(target_string) - INSTR(target_string, '-') - INSTR(REVERSE(target_string), '-') ) AS substring2, -- 提取第三段:最后一个短横线之后的内容 SUBSTR(target_string, LENGTH(target_string) - INSTR(REVERSE(target_string), '-') + 2) AS substring3 FROM data_table WHERE target_string LIKE '%-%-%' -- 先过滤出至少包含两个短横线的字符串
步骤2:验证第二段和第三段的有效性
基于上面拆分出的字段,直接用IN子句匹配各自的有效值列表即可。假设第二段有效值是('dev-test', 'prod-stage'),第三段有效值是('us-east', 'eu-west-1'),示例SQL:
SELECT target_string, substring1, substring2, substring3, -- 验证第二段是否有效 CASE WHEN substring2 IN ('dev-test', 'prod-stage') THEN 'VALID' ELSE 'INVALID' END AS substring2_status, -- 验证第三段是否有效 CASE WHEN substring3 IN ('us-east', 'eu-west-1') THEN 'VALID' ELSE 'INVALID' END AS substring3_status FROM ( -- 嵌套步骤1的拆分逻辑 SELECT target_string, SUBSTR(target_string, 1, INSTR(target_string, '-') - 1) AS substring1, SUBSTR( target_string, INSTR(target_string, '-') + 1, LENGTH(target_string) - INSTR(target_string, '-') - INSTR(REVERSE(target_string), '-') ) AS substring2, SUBSTR(target_string, LENGTH(target_string) - INSTR(REVERSE(target_string), '-') + 2) AS substring3 FROM data_table WHERE target_string LIKE '%-%-%' ) split_result
关键函数说明
INSTR(str, '-'):返回字符串中第一个短横线的位置REVERSE(str):反转字符串,配合INSTR就能找到原字符串最后一个短横线的位置(反转后第一个短横线的位置,对应原字符串末尾到最后一个短横线的距离)SUBSTR(str, start, length):按起始位置和长度截取字符串,精准提取目标段内容
内容的提问来源于stack exchange,提问作者Xaldin
相关产品推荐
相关产品推荐

