RedShift:函数 json_extract_array_element_text(super, integer, boolean) 不存在
RedShift: function json_extract_array_element_text(super, integer, boolean) does not exist
我有一个数据到 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转string的函数是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;
我有一个数据到 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转string的函数是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;