在 SQL 上处理部分字符串化部分键值 JSON VARIANT

Handle partial Stringified Partial Key-value JSON VARIANT on SQL

我有一个如下所示的变体对象:

  {
  "build_num": "111",
  "city_name": "Paris",    
  "rawData": "\"sku\":\"AAA\",\"price\":19.98,\"currency\":\"USD\",\"quantity\":1,\"size\":\"\"}",
  "country": "France"
}

所以你可以看到它的一部分是常规的键值对,比如 build num 和 city name,但是我们有原始数据,它的值是 JSON[=14= 的字符串化版本]

我想从中创建一个变体,如下所示:

       {
          "build_num": "111",
          "city_name": "Paris",    
          "rawData": {
    
              "sku":"AAA",
              "price":19.98,
              "currency":"USD",
               "quantity":1}

         "country": "France"
    }

我想在 SQL(雪花)中完成这一切 - 这可能吗?

所以为了将“数据”插入我使用了 CTE,并转义了子 json,所以它如您所描述的那样在数据库中。我还必须添加缺少的对象令牌开头 {,以使 rawData 有效。

WITH data AS (
    SELECT parse_json(json) as json
    FROM VALUES 
        ('{"build_num": "111","city_name": "Paris","country": "France","rawData": "{\"sku\":\"AAA\",\"price\":19.98,\"currency\":\"USD\",\"quantity\":1,\"size\":\"\"}"}')
    v( json)
)
SELECT 
    json,
    json:rawData as raw_data,
    parse_json(raw_data) as sub_json,
    OBJECT_INSERT(json, 'rawData', sub_json, true) as all_json
FROM data;

所以这展示了逐步转换数据,通过 PARSE_JSON, and re inject via OBJECT_INSERT 将结果解析为原始对象。

WITH data AS (
    SELECT parse_json(json) as json
    FROM VALUES 
        ('{"build_num": "111","city_name": "Paris","country": "France","rawData": "{\"sku\":\"AAA\",\"price\":19.98,\"currency\":\"USD\",\"quantity\":1,\"size\":\"\"}"}')
    v( json)
)
SELECT 
    OBJECT_INSERT(json, 'rawData', parse_json(json:rawData), true) as all_json
FROM data;

TRY_PARSE_JSON 将从 JSON 元素中清除额外的斜线,下面是参考:

 select
            column1 as n,
            try_parse_json(column1) as v 
                   from
        values
            (
                '{
  "build_num": "111",
  "city_name": "Paris",    
  "rawData": "{\"sku\":\"AAA\",\"price\":19.98,\"currency\":\"USD\",\"quantity\":1,\"size\":\"\"}",
  "country": "France"}'
            ) as vals;