WITH base AS (
SELECT
id AS company_id,
name,
TRY_PARSE_JSON(custom_fields) AS cf
FROM companies
WHERE name = 'Klarna'
),
kv AS (
SELECT
b.company_id,
b.name,
k.value::STRING AS field_id,
COALESCE(
TRY_PARSE_JSON(GET(b.cf, k.value::STRING)::STRING),
GET(b.cf, k.value::STRING)
) AS v_norm
FROM base b,
LATERAL FLATTEN(input => OBJECT_KEYS(b.cf)) k
),
exploded AS (
SELECT
company_id,
name,
field_id,
v.value::STRING AS value_id
FROM kv,
LATERAL FLATTEN(input => IFF(IS_ARRAY(v_norm), v_norm, ARRAY_CONSTRUCT(v_norm))) v
),
res AS (
SELECT
e.company_id,
e.name,
m.name AS field_name,
e.value_id,
m.value_type,
m.dropdown_options
FROM exploded e
JOIN fields_metadata m ON m.id = e.field_id
)
SELECT *
FROM res
PIVOT(MAX(value_id) FOR field_name IN (ANY ORDER BY field_name))
ORDER BY 1;