避免在 BigQuery 的 JSON_EXTRACT 函数中使用指数符号
avoiding exponential notation in JSON_EXTRACT function in 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 函数将大整数替换为指数表示法?
您可以在查询本身中将结果转换为 INTEGER。
SELECT json, INTEGER(JSON_EXTRACT(json, "$.log_id")) AS log_id
FROM dataset.table;
如您问题的评论中所述,在 JSON 中存储大量数字可能会导致您失去任何超过 2^53 的数字的精度(在 http://rfc7159.net/rfc7159 中搜索 "numeric" ).如果发生这种情况,JSON 解析库本身就会丢失精度,因此在查询的其他地方转换为 INTEGER(或进行一些 API 级别的更改)将无济于事。
我同意@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;
我正在使用 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 函数将大整数替换为指数表示法?
您可以在查询本身中将结果转换为 INTEGER。
SELECT json, INTEGER(JSON_EXTRACT(json, "$.log_id")) AS log_id
FROM dataset.table;
如您问题的评论中所述,在 JSON 中存储大量数字可能会导致您失去任何超过 2^53 的数字的精度(在 http://rfc7159.net/rfc7159 中搜索 "numeric" ).如果发生这种情况,JSON 解析库本身就会丢失精度,因此在查询的其他地方转换为 INTEGER(或进行一些 API 级别的更改)将无济于事。
我同意@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;