BigQuery 结构自省
Bigquery struct introspection
有没有办法获取结构的元素类型?例如:
SELECT #TYPE(structField.y)
SELECT #TYPE(structField)
...etc
可以吗?我能找到的最接近的是通过查询编辑器和它为验证查询所做的网络调用:
您可以试试下面的方法。
SELECT COLUMN_NAME, DATA_TYPE
FROM `your-project.your-dataset.INFORMATION_SCHEMA.COLUMNS`
WHERE TABLE_NAME = 'your-table-name'
AND COLUMN_NAME = 'your-struct-column-name'
ORDER BY ORDINAL_POSITION
您可以使用 INFORMATION_SCHEMA
for BigQuery 查看此 documentation 以了解更多详细信息。
下面是我测试的截图。
数据:
使用上述语法的结果:
正如我在评论中已经提到的那样 - 一种选择是模仿相同的非常干的 运行 调用,并以这样一种方式构建查询,它会失败并显示准确的错误消息,为您提供信息正在找。显然,这假设您的用例可以用您喜欢的任何脚本语言实现。应该比较容易做。
与此同时,我正在寻找在 SQL 查询中进行此操作的方法。
下面是另一个选项的例子。
它仅限于以下类型,which might fit or not into your particular
用例
object, array, string, number, boolean, null
所以例子是
select
s.birthdate, json_type(to_json(s.birthdate)),
s.country, json_type(to_json(s.country)),
s.age, json_type(to_json(s.age)),
s.weight, json_type(to_json(s.weight)),
s.is_this, json_type(to_json(s.is_this)),
from (
select struct(date '2022-01-01' as birthdate, 'UA' as country, 1 as age, 2.5 as weight, true as is_this) s
)
有输出
有没有办法获取结构的元素类型?例如:
SELECT #TYPE(structField.y)
SELECT #TYPE(structField)
...etc
可以吗?我能找到的最接近的是通过查询编辑器和它为验证查询所做的网络调用:
您可以试试下面的方法。
SELECT COLUMN_NAME, DATA_TYPE
FROM `your-project.your-dataset.INFORMATION_SCHEMA.COLUMNS`
WHERE TABLE_NAME = 'your-table-name'
AND COLUMN_NAME = 'your-struct-column-name'
ORDER BY ORDINAL_POSITION
您可以使用 INFORMATION_SCHEMA
for BigQuery 查看此 documentation 以了解更多详细信息。
下面是我测试的截图。
数据:
使用上述语法的结果:
正如我在评论中已经提到的那样 - 一种选择是模仿相同的非常干的 运行 调用,并以这样一种方式构建查询,它会失败并显示准确的错误消息,为您提供信息正在找。显然,这假设您的用例可以用您喜欢的任何脚本语言实现。应该比较容易做。
与此同时,我正在寻找在 SQL 查询中进行此操作的方法。
下面是另一个选项的例子。
它仅限于以下类型,which might fit or not into your particular
用例
object, array, string, number, boolean, null
所以例子是
select
s.birthdate, json_type(to_json(s.birthdate)),
s.country, json_type(to_json(s.country)),
s.age, json_type(to_json(s.age)),
s.weight, json_type(to_json(s.weight)),
s.is_this, json_type(to_json(s.is_this)),
from (
select struct(date '2022-01-01' as birthdate, 'UA' as country, 1 as age, 2.5 as weight, true as is_this) s
)
有输出