如何在SQL中从字符串列提取指定匹配值作为新列?
解决方案
首先,你之前的语句返回空值是因为目标字符串中不存在promoid字段,且正则写法不够灵活。针对需要提取的字段,以下是适配你数据格式的正则提取方案(以Hive/Spark SQL语法为例):
提取单个字段的语句
提取valueid:
regexp_extract(content, 'valueid=([^\\{|\\{amp\\}]+)', 1)解释:匹配
valueid=开头,直到遇到{|}或{amp}为止的所有字符,捕获组1返回对应值。提取source:
regexp_extract(content, 'source:([^\\{|]+)', 1)解释:匹配
source:开头,直到遇到{|}为止的所有字符,捕获组1返回对应值。提取pascode:
regexp_extract(content, 'pascode:([^\\{|]+)', 1)解释:匹配
pascode:开头,直到遇到{|}为止的所有字符,捕获组1返回对应值。提取version:
regexp_extract(content, 'version:([^\\n]+)', 1)解释:匹配
version:开头,直到行尾的所有字符,捕获组1返回对应值。
完整SQL示例
如果要一次性生成四个新列,可使用如下语句:
SELECT content, regexp_extract(content, 'valueid=([^\\{|\\{amp\\}]+)', 1) AS valueid, regexp_extract(content, 'source:([^\\{|]+)', 1) AS source, regexp_extract(content, 'pascode:([^\\{|]+)', 1) AS pascode, regexp_extract(content, 'version:([^\\n]+)', 1) AS version FROM your_table;
关键说明
- 正则中的
[^...]是否定字符集,表示匹配除括号内字符之外的任意字符,能精准定位字段值的边界。 - 注意转义特殊字符:
{|}在正则中有特殊含义,需要用\\转义;如果是在其他SQL引擎中,转义规则可能略有不同,可根据实际调整。
内容的提问来源于stack exchange,提问作者rogercake
相关产品推荐
相关产品推荐

