如何从 Redshift table 中的 JSON 数组值中删除撇号?

How to remove apostrophe from JSON array value in Redshift table?

我在一列中有一个 JSON 字符串,例如[{'id': 2746, 'name': "HaZore'a", 'lat': Decimal('32.644516'), 'lon': Decimal('35.11918')}] of我的 RS table。我的要求是从名称值 (HaZore'a) 中删除这个单引号,然后用双引号替换所有单引号并删除方括号,因为 JSON 只识别双引号。我试过这样做

replace(replace(left(right((replace(replace(city, '\'', '"'), 'None', '"None"')),
                                              len((replace(replace(city, '\'', '"'), 'None', '"None"'))) - 1),
                                        len((replace(replace(city, '\'', '"'), 'None', '"None"'))) - 2), '\'',
                                   '"'), 'Decimal(', ''), ')', '')

但是它给我留下了这样的名称值中的双引号 {"id": 2746, "name": "HaZore"a", "lat": "32.644516", "lon": "35.11918 "}.

我应该如何更新上面的语句以从列中的名称值中删除撇号。我有几行名称值带有撇号。

请帮忙。

谢谢 Ajinkya

我认为您需要转向 regexp_replace() 以更正确地进行模式匹配。参见:https://docs.aws.amazon.com/redshift/latest/dg/REGEXP_REPLACE.html

由于此文本是 json-like 您的双引号文本中包含单引号的文本将仅包含字母字符(单引号除外)。您可以使用它来进行模式匹配。

我有一个 postgres fiddle 来演示(见评论)。现在 Redshift 和 postgres 以不同的方式转义文本中的单引号,因此需要进行一些调整,但我稍后会讲到。

数据设置:

create table test as 
select '[{''id'': 2746, ''name'': "HaZore''a", ''lat'': Decimal(''32.644516''), ''lon'': Decimal(''35.11918'')}]'''::text 
as txt;

SQL查询:

select replace(regexp_replace(txt, '("[[:alpha:]]*)''([[:alpha:]]*")', '-'), '''', '"') 
from test;

我将撇号改为破折号以使事情更清楚。您可以根据需要随意更改或删除它。

现在要转义 Redshift 中的单引号,我认为您需要将它们反斜杠。所以查询更改为:

select replace(regexp_replace(txt, '("[[:alpha:]]*)\'([[:alpha:]]*")', '-'), '\'', '"') 
from test;

由于我还没有启动 Redshift 在那个环境中进行测试,请原谅任何错误。