google-bigquery - 在 Bigquery 中,如何将结构的字符串化数组转换为正确的数组?
问题描述
我想将数据集中每个表的标签存储到包含 (table_name, label_name, label_value) 的表中,以便我可以选择带有标签条件的表名(例如, a WHERE label_name = 'xxx' and label_value = 'yyy'
)。
通过这个查询,我可以提取一个字符串化的结构数组,每个都包含标签名称和标签值:
*
FROM `mydataset.INFORMATION_SCHEMA.TABLE_OPTIONS`
WHERE option_name = 'labels'
输出如下所示:
WITH output AS
(
SELECT "table_name_a" as table_name, "ARRAY<STRUCT<STRING, STRING>>" AS option_type, "[STRUCT(\"label_name_a_1\", \"label_value_a_1\"), STRUCT(\"label_name_a_2\", \"label_value_a_2\"), STRUCT(\"label_name_a_3\", \"label_value_a_3\")]" as option_value
UNION ALL
SELECT "table_name_b" as table_name, "ARRAY<STRUCT<STRING, STRING>>" AS option_type, "[STRUCT(\"label_name_b_1\", \"label_value_b_1\"), STRUCT(\"label_name_b_2\", \"label_value_b_2\"), STRUCT(\"label_name_b_3\", \"label_value_b_3\")]" as option_value
)
SELECT * FROM output
直观的方法是转换为数组并指定结构:
SELECT ARRAY<STRUCT<STRING, STRING>>[STRUCT("label_name_a_1", "label_value_a_1"), STRUCT("label_name_a_2", "label_value_a_2"), STRUCT("label_name_a_3", "label_value_a_3")]
但我找不到为每个 option_value “动态”执行此操作的方法
一个非常糟糕的解决方案是转换字符串然后使用 JSON_EXTRACT 但我认为可能有更好更简单的方法来做到这一点?
谢谢!
解决方案
这是将选项值字符串转换为ARRAY<STRUCT<key STRING, value STRING>>
类型的代码示例:
DECLARE optionValue DEFAULT ((select option_value
FROM `zyun.INFORMATION_SCHEMA.TABLE_OPTIONS`
WHERE option_name = 'labels'
AND table_name = 'test'));
DECLARE label ARRAY<STRUCT<key STRING, value STRING>>;
EXECUTE IMMEDIATE "SELECT ARRAY<STRUCT<key STRING, value STRING>> " || optionValue INTO label;
SELECT label;
输出:
SELECT label; -- at [9:1]
+-----------------------------------------------------------+
| label |
+-----------------------------------------------------------+
| [{"key":"aaa","value":"bbb"},{"key":"ccc","value":"ddd"}] |
+-----------------------------------------------------------+
推荐阅读
- ruby-on-rails - Rails 应用程序仅将“created_at”和“updated_at”添加到 DB
- javascript - 打开 NonBootstrap 模式以使用 PHP 和 JavaScript 更新/编辑表中的行
- c++ - 为什么第二次调用 name() 打印“Alex . n”?
- ios - 快速在 UIImageView 上创建缩放
- c - 如何利用结构数组根据用户输入输出给定的结构
- r - R ImageMagick。如何用单一颜色填充图像的子集
- ios - 为什么 iOs 代码使用如此多的内存和 CPU
- arrays - 如何使用 Fortran 90 将一维数组的数据写入文件的下一列?
- react-native - NodeJS 是 React Native 应用程序背后的唯一服务器吗?
- android - 在onCreate中使用getActivity时如何让onCreate在onCreateView之前加载?