I have a table that contains a field of a varchar type. Within this field, there are empty arrays, arrays and maps stored as strings. something like this:
id | dumped_field |
---|---|
1 | [] |
2 | [123,456,789] |
3 | {'0":123, "1":456} |
4 | NULL |
The goal would be to try and convert this string field as an array as opposed to a string:
id | dumped_field |
---|---|
1 | [] |
2 | [123,456,789] |
3 | [123,456] |
4 | NULL |
The problem is that these various data types have been stored as strings into this field. Is there a way to A) convert the string of array into an array and B) convert the string of json into an array?
CodePudding user response:
Assuming your data is json (and after fixing the quotes in the object) you can process it as json (leveraging try
and try_cast
):
-- sample data
WITH dataset (id, dumped_field) AS (
VALUES (1, '[]'),
(2, '[123,456,789]'),
(3, '{"0":123, "1":456}'),
(4, NULL)
)
-- query
select coalesce(
try_cast(json_parse(dumped_field) as array(varchar)), -- try process as array
try(map_values(cast(json_parse(dumped_field) as map(varchar, varchar))))) -- try process as object
from dataset;
Output:
_col0 |
---|
[] |
[123, 456, 789] |
[123, 456] |
NULL |