红移数据库中的子字符串匹配
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": []。上面的字符串(在问题中)在一个列中以上是关于红移数据库中的子字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章
Python Dataframe:DF列中的字符串包含来自不同DF的子字符串和匹配时返回的子字符串值