如何从 Snowflake 中的 VARCHAR 列中提取 JSON 值?
How to extract JSON value from VARCHAR column in Snowflake?
我有一个 VARCHAR 列存储 JSON 数据。
这是一行:
{
"id": null,
"ci": null,
"mr": null,
"meta_data":
{
"product":
{
"product_id": "123xyz",
"sales":
{
"d_code": "UK",
"c_code": "5814"
},
"amount":
{
"currency": "USD",
"value": -1230
},
"entry_mode": "virtual",
"transaction_date": "2020-01-01",
"transaction_type": "purchase",
"others":
[]
}
}
}
示例数据:
WITH t1 AS (
SELECT '{"id":null,"ci":null,"mr":null,"meta_data":{"product":{"product_id":"123xyz","sales":{"d_code":"UK","c_code":"5814"},"amount":{"currency":"USD","value":-1230},"entry_mode":"virtual","transaction_date":"2020-01-01","transaction_type":"purchase","others":[]}}}'::varchar AS value
)
在 Postgres 中,我确实喜欢这样。如何在 Snowflake 中提取以下值?
SELECT
value,
value -> 'meta_data' -> 'product' ->> 'product_id' AS product_id,
value -> 'meta_data' -> 'product' -> 'sales' ->> 'd_code' AS d_code,
value -> 'meta_data' -> 'product' -> 'sales' ->> 'c_code' AS c_code,
value -> 'meta_data' -> 'product' -> 'amount' ->> 'currency' AS currency,
value -> 'meta_data' -> 'product' ->> 'entry_mode' AS entry_mode,
value -> 'meta_data' -> 'product' ->> 'transaction_type' AS transaction_type
FROM t1
Snowflake 也可以。关键是 TRY_PARSE_JSON/PARSE_JSON:
的用法
Interprets an input string as a JSON document, producing a VARIANT value.
WITH t1 AS (
SELECT '{"id":null,"ci":null,"mr":null,"meta_data":{"product":{"product_id":"123xyz","sales":{"d_code":"UK","c_code":"5814"},"amount":{"currency":"USD","value":-1230},"entry_mode":"virtual","transaction_date":"2020-01-01","transaction_type":"purchase","others":[]}}}'::varchar AS value
)
SELECT TRY_PARSE_JSON(t1.value) AS v
,v:meta_data:product:product_id::TEXT AS product_id
,v:meta_data:product:sales:d_code::TEXT AS d_code
-- ...
FROM t1;
或使用另一个 cte:
WITH t1 AS (
SELECT '{"id":null,"ci":null,"mr":null,"meta_data":{"product":{"product_id":"123xyz","sales":{"d_code":"UK","c_code":"5814"},"amount":{"currency":"USD","value":-1230},"entry_mode":"virtual","transaction_date":"2020-01-01","transaction_type":"purchase","others":[]}}}'::varchar AS value
), t1_cast AS (
SELECT *,TRY_PARSE_JSON(t1.value) AS v
FROM t1
)
SELECT
v:meta_data:product:product_id::TEXT AS product_id
,v:meta_data:product:sales:d_code::TEXT AS d_code
-- ...
FROM t1_cast;
输出:
在 Snowflake 中,您使用 VARIANT 数据类型来存储半结构化数据,例如 JSON。首先,你应该使用函数PARSE_JSON将VARCHAR字符串转换为VARIANT,然后你可以这样查询:
WITH t1 AS (
SELECT parse_json('{"id":null,"ci":null,"mr":null,"meta_data":{"product":{"product_id":"123xyz","sales":{"d_code":"UK","c_code":"5814"},"amount":{"currency":"USD","value":-1230},"entry_mode":"virtual","transaction_date":"2020-01-01","transaction_type":"purchase","others":[]}}}'::varchar) AS value
)
select value:meta_data:product:product_id as product_id,
value:meta_data:product:sales:d_code as d_code,
value:meta_data:product:sales:c_code AS c_code,
value:meta_data:product:amount:currency AS currency,
value:meta_data:product:entry_mode AS entry_mode,
value:meta_data:product:transaction_type AS transaction_type
from t1;
我有一个 VARCHAR 列存储 JSON 数据。 这是一行:
{
"id": null,
"ci": null,
"mr": null,
"meta_data":
{
"product":
{
"product_id": "123xyz",
"sales":
{
"d_code": "UK",
"c_code": "5814"
},
"amount":
{
"currency": "USD",
"value": -1230
},
"entry_mode": "virtual",
"transaction_date": "2020-01-01",
"transaction_type": "purchase",
"others":
[]
}
}
}
示例数据:
WITH t1 AS (
SELECT '{"id":null,"ci":null,"mr":null,"meta_data":{"product":{"product_id":"123xyz","sales":{"d_code":"UK","c_code":"5814"},"amount":{"currency":"USD","value":-1230},"entry_mode":"virtual","transaction_date":"2020-01-01","transaction_type":"purchase","others":[]}}}'::varchar AS value
)
在 Postgres 中,我确实喜欢这样。如何在 Snowflake 中提取以下值?
SELECT
value,
value -> 'meta_data' -> 'product' ->> 'product_id' AS product_id,
value -> 'meta_data' -> 'product' -> 'sales' ->> 'd_code' AS d_code,
value -> 'meta_data' -> 'product' -> 'sales' ->> 'c_code' AS c_code,
value -> 'meta_data' -> 'product' -> 'amount' ->> 'currency' AS currency,
value -> 'meta_data' -> 'product' ->> 'entry_mode' AS entry_mode,
value -> 'meta_data' -> 'product' ->> 'transaction_type' AS transaction_type
FROM t1
Snowflake 也可以。关键是 TRY_PARSE_JSON/PARSE_JSON:
的用法Interprets an input string as a JSON document, producing a VARIANT value.
WITH t1 AS (
SELECT '{"id":null,"ci":null,"mr":null,"meta_data":{"product":{"product_id":"123xyz","sales":{"d_code":"UK","c_code":"5814"},"amount":{"currency":"USD","value":-1230},"entry_mode":"virtual","transaction_date":"2020-01-01","transaction_type":"purchase","others":[]}}}'::varchar AS value
)
SELECT TRY_PARSE_JSON(t1.value) AS v
,v:meta_data:product:product_id::TEXT AS product_id
,v:meta_data:product:sales:d_code::TEXT AS d_code
-- ...
FROM t1;
或使用另一个 cte:
WITH t1 AS (
SELECT '{"id":null,"ci":null,"mr":null,"meta_data":{"product":{"product_id":"123xyz","sales":{"d_code":"UK","c_code":"5814"},"amount":{"currency":"USD","value":-1230},"entry_mode":"virtual","transaction_date":"2020-01-01","transaction_type":"purchase","others":[]}}}'::varchar AS value
), t1_cast AS (
SELECT *,TRY_PARSE_JSON(t1.value) AS v
FROM t1
)
SELECT
v:meta_data:product:product_id::TEXT AS product_id
,v:meta_data:product:sales:d_code::TEXT AS d_code
-- ...
FROM t1_cast;
输出:
在 Snowflake 中,您使用 VARIANT 数据类型来存储半结构化数据,例如 JSON。首先,你应该使用函数PARSE_JSON将VARCHAR字符串转换为VARIANT,然后你可以这样查询:
WITH t1 AS (
SELECT parse_json('{"id":null,"ci":null,"mr":null,"meta_data":{"product":{"product_id":"123xyz","sales":{"d_code":"UK","c_code":"5814"},"amount":{"currency":"USD","value":-1230},"entry_mode":"virtual","transaction_date":"2020-01-01","transaction_type":"purchase","others":[]}}}'::varchar) AS value
)
select value:meta_data:product:product_id as product_id,
value:meta_data:product:sales:d_code as d_code,
value:meta_data:product:sales:c_code AS c_code,
value:meta_data:product:amount:currency AS currency,
value:meta_data:product:entry_mode AS entry_mode,
value:meta_data:product:transaction_type AS transaction_type
from t1;