我如何替换 Redshift 中的 JSON 值?

How can i replace JSON values in Redshift?

我的 redshift table 中有一个 JSON 数组,它有 True/False/None 个值。现在由于 JSON 只接受小写值而不接受 None,我想将这些值转换为小写值 true/false/null。请记住,我的 JSON 数组有一些键,其值也包含名称 True.

示例:

[{"id": 20198, "name": "True Ventures", "path": "true_ventures", "type": "Fund", "lead": False}, {"id": 324746, "name": "XXX", "path": "XXX", "type": "Investor", "url": "XXX", "image": "XXX", "lead": False}]

[{"id": 20198, "name": "True Ventures", "path": "true_ventures", "type": "Fund", "lead": True}, {"id": 324746, "name": "XXX", "path": "XXX", "type": "Investor", "url": "XXX", "image": "XXX", "lead": True}]

[{"id": 20198, "name": "True Ventures", "path": "true_ventures", "type": "Fund", "lead": None}, {"id": 324746, "name": "XXX", "path": "XXX", "type": "Investor", "url": "XXX", "image": "XXX", "lead": None}]

现在,我想替换整个 JSON 数组中存在 TrueFalseNone 值的 False/True/None 值. (在这种情况下是主键,而不是公司的名称和路径)。我目前正在使用

case
       when column_name ilike ('%True%') then regexp_replace(replace(column_name, '\'', '"'), 'True', 'true')
       when column_name ilike ('%False%')then regexp_replace(replace(column_name, '\'', '"'), 'False', 'false')
       when column_name ilike ('%None%') then replace(replace(column_name,'\'','"'),'None','"None"')
       end as column_name

请告诉我 regexp_replace 的正确使用方法是什么?

谢谢!

由于这是 json-like 文本,因此可以做出一些假设 - 这些关键字将始终跟在冒号之后(不在列表中),并且冒号不会出现在字段名称中。也有可能,但您需要确认,冒号不会出现在后跟这些关键字之一的数据值中,并且这些关键字将仅跟一个冒号 space 字符。如果这一切都是真的,那么应该直接进行更改。

只需将“: True”替换为“: true”。其他关键字也是如此。您的案例陈述是错误的,因为它只允许每行文本替换一个关键字,这对您的示例数据来说是不正确的。因此,作为一个未经测试的示例,它会是什么样子:

Select replace(replace(replace(column_name, ': True', ': true'),
            ': False', ': false'),
            ': None', ': null') as column_name 
from table_name;

如果需要更通用的方法,则需要有关 corner-cases 的样本数据。