红移数据库中的子字符串匹配

Posted

技术标签:

【中文标题】红移数据库中的子字符串匹配【英文标题】:substring match in redshift database 【发布时间】:2015-11-04 07:36:27 【问题描述】:

我有一个红移表“人”,其中特定列包含类似这样的数据

["attributeName":"name","attributeMetadata":null,"attributeValue":"KitchenAid - 7-Speed Hand Mixer - White","attributeImageType":"PRODUCT","attributeStatusCodes":[],
"attributeName":"title","attributeMetadata":null,"attributeValue":"KitchenAid","attributeImageType":"PRODUCT","attributeStatusCodes":[],

"attributeName":"address","attributeMetadata":null,"attributeValue":"address","attributeImageType":"PRODUCT","attributeStatusCodes":[],

"attributeName":"PIN CODE","attributeMetadata":null,"attributeValue":"32110","attributeImageType":"IMG","attributeStatusCodes":[]]

我只想提取包含PIN CODE 的字典/json/子字符串(见下文)

"attributeName":"PIN CODE","attributeMetadata":null,"attributeValue":"32110","attributeImageType":"IMG","attributeStatusCodes":[]

我尝试了以下查询,它给出了以下错误

select distinct regexp_substr(attributes,'.*(.*?"attributeName":"PIN CODE".*?).*') from person ;

ERROR:  Invalid content of repeat range
DETAIL:  
  -----------------------------------------------
  error:  Invalid content of repeat range
  code:      8002
  context:   T_regexp_init
  query:     528401
  location:  funcs_expr.cpp:130
  process:   query2_40 [pid=12603]
  -----------------------------------------------

我猜这个问题是因为单个列中有多个attributeName。是他们达到预期结果的一种方式。

【问题讨论】:

你应该将花括号转义为\,否则它会被假定为像\w2,5这样的量词。这就是为什么它会抛出错误"Invalid content of repeat range" @Mario 抱歉没用,出现同样的错误 你有机会制作小提琴吗? 首先提供一个准确的表定义。 【参考方案1】:

我不确定我是否理解正确,但你可以尝试使用 LIKE:

    select * from person where attributes LIKE '%"attributeName":"PIN CODE"%';

【讨论】:

@IvanNo 我想要子字符串 "attributeName":"PIN CODE","attributeMetadata":null,"attributeValue":"32110","attributeImageType":"IMG","attributeStatusCodes": []。上面的字符串(在问题中)在一个列中

以上是关于红移数据库中的子字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

SOLR 中的子字符串匹配

匹配字符串中的子字符串,允许 1 个字符不匹配

错误太多参数试图匹配字符串bash中的子字符串[重复]

Python Dataframe:DF列中的字符串包含来自不同DF的子字符串和匹配时返回的子字符串值

当列表值与Pyspark数据帧中的列值的子字符串匹配时,填充新列

根据匹配 where 条件中的子字符串来选择值