如何提取SQL嵌套结构列中引号包裹的内容?
解决SQL中提取引号内内容/剥离特殊符号的问题
首先,你遇到的报错大概率是因为element_at返回的结果不是字符串类型,导致正则函数无法直接处理。先确保把拿到的结构值转为字符串,比如用TO_STRING()或者CAST()函数,再进行正则操作。
下面给你几种可行的方案:
方案1:用正则提取引号内的内容
直接匹配双引号之间的部分,用REGEXP_EXTRACT提取分组内容,示例SQL:
SELECT REGEXP_EXTRACT(TO_STRING(element_at(your_map_col, 'your_key')), '\"([^\"]+)\"', 1) AS brand_name FROM your_table;
解释:
TO_STRING()把element_at的结果转成字符串,解决类型不匹配问题- 正则
\"([^\"]+)\"匹配双引号包裹的内容,([^\"]+)是捕获分组,提取引号内的文本 - 最后一个
1表示取第一个捕获分组的结果
方案2:用正则替换掉所有特殊符号
如果只是要去掉#和",可以直接把这两个字符替换为空,示例:
SELECT REGEXP_REPLACE(TO_STRING(element_at(your_map_col, 'your_key')), '[#\"]', '') AS brand_name FROM your_table;
解释:正则[#\"]匹配#或",替换为空字符串即可得到纯文本。
方案3:非正则的字符串截取方法
如果正则还是有问题,也可以用字符串定位函数实现:
SELECT SUBSTRING( TO_STRING(element_at(your_map_col, 'your_key')), INSTR(TO_STRING(element_at(your_map_col, 'your_key')), '\"') + 1, INSTR(TO_STRING(element_at(your_map_col, 'your_key')), '\"', -1) - INSTR(TO_STRING(element_at(your_map_col, 'your_key')), '\"') - 1 ) AS brand_name FROM your_table;
解释:
INSTR(str, '\"')找到第一个双引号的位置,+1跳过引号INSTR(str, '\"', -1)找到最后一个双引号的位置,减去第一个引号的位置再减1,就是要截取的长度
注意:不同SQL引擎的函数名可能有差异,比如Hive/Spark SQL用INSTR,Trino用STRPOS,根据你使用的引擎调整即可。
内容的提问来源于stack exchange,提问作者Philo
相关产品推荐
相关产品推荐

