避免BigQuery中

时间:2015-10-22 10:27:10

标签: sql json google-bigquery

我正在使用BigQuery并在某些字段中存储JSON字符串。 在这里,我有一个名为“json”的字段,其中包含JSON字符串,如下所示:

{"log_id":939286972300751993,"status":"good"}

并使用下面的sql查询:

SELECT json, JSON_EXTRACT(json, "$.log_id") AS log_id
FROM dataset.table;

结果是:

                    json                         |       log_id
-------------------------------------------------+---------------------
{"log_id": 939286972300751993, "status": "good"} | 9.39286972300752e+17

但我的期望是:

                    json                         |       log_id
-------------------------------------------------+---------------------
{"log_id": 939286972300751993, "status": "good"} | 939286972300751993
在我的上下文中,

“log_id”应该被视为INTEGER。 有没有办法避免JSON_EXTRACT函数将大整数替换为指数表示法?

2 个答案:

答案 0 :(得分:2)

您可以在查询中将结果转换为INTEGER。

SELECT json, INTEGER(JSON_EXTRACT(json, "$.log_id")) AS log_id
FROM dataset.table;

如您对问题的评论中所述,在JSON中存储大数字可能会导致您丢失超过2 ^ 53的任何数字的精度(搜索"数字"在http://rfc7159.net/rfc7159中)。如果发生这种情况,精度将在JSON解析库本身中丢失,因此在查询中的其他位置(或进行一些API级别更改)中转换为INTEGER将无济于事。

答案 1 :(得分:0)

我同意@ jeremy-condit& @Álvaro-gonzález关于存储大数字,但有时你无法改变你给出的数据..

由于将JSON_EXTRACT结果转换为整数导致空值的答案,我已经使用了regexp_extract

虽然不是最好的方法,但这可能对其他人有用:

SELECT json, integer(regexp_extract(json, "\"log_id\":([0-9]*),")) as log_id
FROM dataset.table;