如何从 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:

的用法

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;