amazon-redshift - RedShift:函数 json_extract_array_element_text(super, integer, boolean) 不存在
问题描述
我有一个 RedShift 的数据:
id: 210396
created: 2021-09-01 05:42:15.80726
inputs_super: [{"desc":" Please check the pledge box, Pledge content","name":"pledge","type":"dropdown","values":["Agree","Disagree"]}]
desc: " Please check the pledge box, Pledge content"
name: "pledge"
values: ["Agree","Disagree"]
我需要在 RedShift 解析“值”列表并为每个列表项创建行。
例子:
id: 210396
created: 2021-09-01 05:42:15.80726
inputs_super: [{"desc":" Please check the pledge box, Pledge content","name":"pledge","type":"dropdown","values":["Agree","Disagree"]}]
desc: " Please check the pledge box, Pledge content"
name: "pledge"
values: ["Agree"]
id: 210396
created: 2021-09-01 05:42:15.80726
inputs_super: [{"desc":" Please check the pledge box, Pledge content","name":"pledge","type":"dropdown","values":["Agree","Disagree"]}]
desc: " Please check the pledge box, Pledge content"
name: "pledge"
values: ["Disagree"]
我创建此查询来执行此操作:
CREATE TEMP TABLE seq_0_to_100 AS (
SELECT 0 AS i UNION ALL
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5
-- I am stopping here, you could easily generate this as a VIEW with 100+ real rows...
);
WITH all_values AS (
SELECT c.*, d.desc, d.name, d.values
FROM (
SELECT id, created, JSON_PARSE(inputs) AS inputs_super
FROM course.table
WHERE prompttype = 'input'
) AS c,
c.inputs_super AS d
ORDER BY created DESC
LIMIT 10
), split_values AS (
SELECT id, json_extract_array_element_text(values, seq.i, True) AS size
FROM all_values, seq_0_to_100 AS seq
WHERE seq.i < JSON_ARRAY_LENGTH(values)
)
SELECT * FROM split_values;
但是在尝试拆分列表时(在“split_values”步骤中),我在最后一步出现错误:
错误:函数 json_extract_array_element_text(super, integer, boolean) 不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
可能你知道我该如何解决它?
解决方案
问题是 values 仍然是 super 类型并且需要是一个字符串。将 super 转换为字符串的函数是 json_serialize()。
我很好奇,所以我根据您的问题构建了一个测试用例。这是我的工作版本:
drop table super;
create table super as select 210396 as id, '2021-09-01 05:42:15.80726'::timestamp as created,
'[{"desc":" Please check the pledge box, Pledge content","name":"pledge","type":"dropdown","values":["Agree","Disagree"]}]'::text as inputs,
'Please check the pledge box, Pledge content' as desc, 'pledge' as name;
drop table seq_0_to_100;
CREATE TEMP TABLE seq_0_to_100 AS (
SELECT 0 AS i UNION ALL
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5
-- I am stopping here, you could easily generate this as a VIEW with 100+ real rows...
);
WITH all_values AS (
SELECT c.*, d.desc, d.name, d.values
FROM (
SELECT id, created, JSON_PARSE(inputs) AS inputs_super
FROM super
--WHERE prompttype = 'input'
) AS c,
c.inputs_super AS d
ORDER BY created DESC
--LIMIT 10
), split_values AS (
SELECT id, i, json_serialize(values), json_extract_array_element_text(json_serialize(values), seq.i) AS size
FROM all_values, seq_0_to_100 AS seq
WHERE seq.i < JSON_ARRAY_LENGTH(json_serialize(values))
)
SELECT * FROM split_values;
推荐阅读
- javascript - 使基于 html 和 svg 的重叠元素响应点击事件
- raspberry-pi - 如何使用 I2C 从 EEPROM 后端
- javascript - 复杂的 reducer 逻辑(React、JavaScript)
- python - 我在一个数组中循环并打印第二个数组中的频率,for循环工作正常,但是当函数中的相同代码不起作用时
- python - 如何删除 0 天并仅在 pandas 的数据框中保留时间
- c# - 使用 C# 从 WPF 中的 Json 文件中动态创建带有复选框的多级/嵌套 TreeView
- cmake - 无法在 CMake 配置中链接 HDF5 路径
- npm - 在 node_modules 之外创建的 Powershell 文件
- bash - 将每行文件转换为 bash 参数
- python - 如果变量包含为“否”,我希望我的 python 代码重新启动