我如何替换 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 数组中存在 True
、False
、None
值的 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 的样本数据。
我的 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 数组中存在 True
、False
、None
值的 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 的样本数据。