Как преобразовать JSON строку столбца строки в запрашиваемую таблицу - PullRequest
0 голосов
/ 29 мая 2020

Итак, я экспортировал в BigQuery из Firestore целую коллекцию для выполнения определенных запросов.

После того, как данные были заполнены в моей консоли BigQuery, теперь я могу запросить весь набор следующим образом

SELECT * FROM `myapp-1a602.firestore_orders.orders_raw_changelog` LIMIT 1000

Теперь этот статус выдает мои разные столбцы, но тот, который я ищу, - это столбец данных, в моем столбце данных каждый документ JSON, но в формате json, и мне нужно запросить все эти значения.

Теперь это данные из одной строки

{
    "cart": [{
        "qty": 1,
        "description": "Sprite 1 L",
        "productName": "Sprite 1 Liter",
        "price": 1.99,
        "productId": 9
    }],
    "storeName": "My awesome shop",
    "status": 5,
    "timestamp": {
        "_seconds": 1590713204,
        "_nanoseconds": 916000000
    }
}

Эти данные находятся внутри столбца data , поэтому, если я сделаю это

SELECT data FROM `myapp-1a602.firestore_orders.orders_raw_changelog` LIMIT 1000

Я получу все значения json для каждого документа, но я не знаю, как запросить эти значения, скажем, я хочу знать все заказы с статусом 5 и shopName Мой отличный магазин , теперь мне нужно что-то сделать с этим json, чтобы преобразовать его в таблицу? мне нужно выполнить запрос в самом json?

Как я могу запросить этот json результат?

Спасибо

Ответы [ 4 ]

0 голосов
/ 29 мая 2020

Вы можете использовать UNNEST в предложении WHERE для доступа к столбцам корзины и функции JSON_EXTRACT в предложении WHERE для фильтрации необходимых строк. Вам нужно позаботиться о доступе либо к json root, либо к массиву cart; json_data и cart_items в примере ниже (кстати, в вашем примере shopName не существует, а storeName существует).

WITH
  `myapp-1a602.firestore_orders.orders_raw_changelog` AS (
  SELECT
    '{"cart": [{"qty": 1,"description": "Sprite 1 L","productName": "Sprite 1 Liter","price": 1.99,"productId": 9}, {"qty": 11,"description": "Sprite 11 L","productName": "Sprite 11 Liter","price": 11.99,"productId": 19}],"storeName": "My awesome shop","status": 5,"timestamp": {"_seconds": 1590713204,"_nanoseconds": 916000000}}' json_data )
SELECT
  JSON_EXTRACT(json_data, '$.status') AS status,
  JSON_EXTRACT(json_data, '$.storeName') AS storeName,
  JSON_EXTRACT(cart_items, '$.productName') AS product,
  JSON_EXTRACT_SCALAR(cart_items, '$.qty') AS qty
FROM
  `myapp-1a602.firestore_orders.orders_raw_changelog`,
  UNNEST(JSON_EXTRACT_ARRAY(json_data, '$.cart')) AS cart_items
WHERE
  JSON_EXTRACT(json_data,'$.storeName') like "\"My awesome shop\"" AND 
  CAST(JSON_EXTRACT_SCALAR(json_data,'$.status') AS NUMERIC) = 5
0 голосов
/ 29 мая 2020

Мне нужно что-то сделать с этим json, чтобы преобразовать его в таблицу? мне нужно выполнить запрос в самом json?

Ниже для BigQuery Standard SQL

#standardSQL
SELECT * EXCEPT(data, cart_item), 
  JSON_EXTRACT(data, '$.status') AS status, 
  JSON_EXTRACT(data, '$.storeName') AS storeName,
  JSON_EXTRACT(cart_item, '$.qty') AS qty,
  JSON_EXTRACT(cart_item, '$.description') AS description,
  JSON_EXTRACT(cart_item, '$.productName') AS productName,
  JSON_EXTRACT(cart_item, '$.price') AS price,
  JSON_EXTRACT(cart_item, '$.productId') AS productId
FROM `project.dataset.table`,
UNNEST(JSON_EXTRACT_ARRAY(data, '$.cart')) cart_item   

Если применить к образцу данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 order_id, '''
{
    "cart": [{
        "qty": 1,
        "description": "Sprite 1 L",
        "productName": "Sprite 1 Liter",
        "price": 1.99,
        "productId": 9
    },{
        "qty": 2,
        "description": "Fanta 1 L",
        "productName": "Fanta 1 Liter",
        "price": 1.99,
        "productId": 10
    }],
    "storeName": "My awesome shop",
    "status": 5,
    "timestamp": {
        "_seconds": 1590713204,
        "_nanoseconds": 916000000
    }
}  
'''  data 
)
SELECT * EXCEPT(data, cart_item), 
  JSON_EXTRACT(data, '$.status') AS status, 
  JSON_EXTRACT(data, '$.storeName') AS storeName,
  JSON_EXTRACT(cart_item, '$.qty') AS qty,
  JSON_EXTRACT(cart_item, '$.description') AS description,
  JSON_EXTRACT(cart_item, '$.productName') AS productName,
  JSON_EXTRACT(cart_item, '$.price') AS price,
  JSON_EXTRACT(cart_item, '$.productId') AS productId
FROM `project.dataset.table`,
UNNEST(JSON_EXTRACT_ARRAY(data, '$.cart')) cart_item   

результат будет

Row order_id    status  storeName           qty     description     productName         price   productId    
1   1           5       "My awesome shop"   1       "Sprite 1 L"    "Sprite 1 Liter"    1.99    9    
2   1           5       "My awesome shop"   2       "Fanta 1 L"     "Fanta 1 Liter"     1.99    10   
0 голосов
/ 29 мая 2020

Что вы должны сделать, так это извлечь значения из данных json как: SELECT ....... WHERE data -> '$. StoreName' = "My awesome shop" и data -> '$. status '= 5

При извлечении из корзины или ключей «timestamp» вы получите объект Json, который необходимо извлечь для получения данных. Надеюсь, это вам поможет. Возможно, вы захотите ознакомиться с документацией MySql (https://dev.mysql.com/doc/refman/8.0/en/json.html) или https://www.mysqltutorial.org/mysql-json/.

0 голосов
/ 29 мая 2020

Вы можете работать с функциями json как

CrEATE Table products (id Integer,attribs_json JSON );
INSERT INTO products VALUES (1,'{
    "cart": [{
        "qty": 1,
        "description": "Sprite 1 L",
        "productName": "Sprite 1 Liter",
        "price": 1.99,
        "productId": 9
    }],
    "storeName": "My awesome shop",
    "status": 5,
    "timestamp": {
        "_seconds": 1590713204,
        "_nanoseconds": 916000000
    }
}');
select * from products where attribs_json->"$.status" 
= 5 AND attribs_json->"$.storeName" 
= 'My awesome shop';
id | attribs_json                                                                                                                                                                                                                      
-: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 1 | {"cart": [{"qty": 1, "price": 1.99, "productId": 9, "description": "Sprite 1 L", "productName": "Sprite 1 Liter"}], "status": 5, "storeName": "My awesome shop", "timestamp": {"_seconds": 1590713204, "_nanoseconds": 916000000}}

db <> fiddle здесь

select attribs_json->"$.storeName",attribs_json->"$.status",attribs_json->"$.cart[0].qty" from products where attribs_json->"$.status" 
= 5 AND attribs_json->"$.storeName" 
= 'My awesome shop';
attribs_json->"$.storeName" | attribs_json->"$.status" | attribs_json->"$.cart[0].qty"
:-------------------------- | :----------------------- | :----------------------------
"My awesome shop"           | 5                        | 1                            

db <> fiddle здесь

И есть JSON_EXTRACT для mysql 5.7 и выше.

Наконец, это только текст, поэтому вы также можете использовать REGEXP или RLIKE

Чтобы снова перенести jaso в строки, вы можете использовать JSON_TABLE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...