更新 Flex 表视图

创建 Flex 表的同时,还会创建一个该表附带的默认视图。该视图的名称为 Flex 表名称加上下划线 (_view) 后缀。当您从默认视图执行 select 查询时,Vertica 会提示您运行 Helper 函数 compute_flextable_keys_and_build_view

=> \dv dark*
                  List of View Fields
 Schema |      View      | Column |     Type     | Size
--------+----------------+--------+--------------+------
 public | darkdata_view  | status | varchar(124) |  124
 public | darkdata1_view | status | varchar(124) |  124
(2 rows)

=> SELECT * FROM darkdata_view;
                                        status
-----------------------------------------------------------------------------------------------
 Please run compute_flextable_keys_and_build_view() to update this view to reflect real and
virtual columns in the flex table
(1 row)

有两个 Helper 函数可以创建视图:

使用 BUILD_FLEXTABLE_VIEW

计算出 Flex 表的键 (计算 Flex 表键) 后,通过一个或多个实参调用此函数。{flextable}_keyskey_name 列下的记录将用作视图列以及该键的任何值。如果不存在任何值,则列值为 NULL。

如下所示,无论使用多少参数,调用此函数均将替换现有视图的内容:

如果您不指定 view_name 实参,默认名称将为 Flex 表名称加上 _view 后缀。例如,如果您指定表 darkdata 为此函数的唯一参数,则默认视图的名称为 darkdata_view

您不能指定与默认视图 flex_table_view 名称相同的自定义视图名称,除非您先删除默认命名的视图,然后再自行创建具有相同名称的视图。

创建视图时将存储列结构的定义。因此,如果您创建了 Flex 表视图并随后将虚拟列提升为实际列,您必须重新构建视图。查询具有刚提升的实际列的重建 Flex 表视图可产生两个结果。这些结果同时反映来自实际列和映射数据中的虚拟列的值。

处理视图中的 JSON 重复键名

SQL 是不区分大小写的语言,因此名称 TESTtestTeSt 是完全相同的。JSON 数据区分大小写,因此可以有效包含大小写不同且具有不同值的键名。

当您构建 Flex 表视图时,如果此函数在 {flextable}_keys 表中检测到名称相同但大小写不同的键,此函数将生成警告。例如,对具有重复键名的 Flex 表调用 BUILD_FLEXTABLE_VIEWCOMPUTE_FLEXTABLE_KEYS_AND_BUILD_VIEW(),将生成以下警告:

=> SELECT compute_flextable_keys_and_build_view('dupe');
WARNING 5821:  Detected keys sharing the same case-insensitive key name
WARNING 5909:  Found and ignored keys with names longer than the maximum column-name length limit


                            compute_flextable_keys_and_build_view
----------------------------------------------------------------------------------------------
 Please see public.dupe_keys for updated keys
The view public.dupe_view is ready for querying
(1 row)

虽然 {flextable}_keys 表可以包含大小写不同的重复键名,但视图不能。使用上述任一 Helper 函数创建 Flex 表视图,会将所有重复键名合并成一个由所有小写字符组成的列名称。该列的所有重复键值均将予以保存。例如,如果一个 Flex 表中存在以下键名:

  • test

  • Test

  • tESt

视图将包括虚拟列 test,它具有 test 键、Test 键和 tESt 键的值。

例如,请考虑显示重复 test 键名称的以下查询:

=> \x
Expanded display is on.
dbt=> select * from dupe_keys;
-[ RECORD 1 ]---+--------------------------------------------------------------------------------------------------
key_name        | TesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttest
TesttestTesttestTesttestTesttest
frequency       | 2
data_type_guess | varchar(20)
-[ RECORD 2 ]---+--------------------------------------------------------------------------------------------------
key_name        | TesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttest
TesttestTesttestTesttestTest12345
frequency       | 2
data_type_guess | varchar(20)
-[ RECORD 3 ]---+--------------------------------------------------------------------------------------------------
key_name        | test
frequency       | 8
data_type_guess | varchar(20)
-[ RECORD 4 ]---+--------------------------------------------------------------------------------------------------
key_name        | TEst
frequency       | 8
data_type_guess | varchar(20)
-[ RECORD 5 ]---+--------------------------------------------------------------------------------------------------
key_name        | TEST
frequency       | 8
data_type_guess | varchar(20)

以下查询显示了 dupe Flex 表 (dupe_view)。它显示了合并后的 testtesttesttest... 虚拟列。testTesttESt 虚拟列的所有值均位于 test 列:

=> SELECT * FROM dupe_view;
  test  | testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
testtesttesttesttesttesttesttest
--------+--------------------------------------------------------------------------------------------------
 upper2 |
 half4  |
 lower1 |
 upper1 |
 half1  |
 half4  |
        |
 lower1 |
 half1  |
 upper2 |
        |
 lower2 |
 lower3 |
 upper1 |
 lower2 |
 lower3 |
(16 rows)

创建 Flex 表视图

下面的示例演示了如何从包含 JSON 数据的 Flex 表 darkdata 创建视图 dd_view

=> CREATE VIEW dd_view AS SELECT "user.lang"::VARCHAR, "user.name"::VARCHAR FROM darkdata;
CREATE VIEW

查询您指定的键名及其值:

=> SELECT * FROM dd_view;
 user.lang |      user.name
-----------+---------------------
 en        | Uptown gentleman.
 en        | The End
 it        | laughing at clouds.
 es        | I'm Toasterâ¥
           |
 en        | ~G A B R I E L A â¿
           |
 en        | Avita Desai
 tr        | seydo shi
           |
           |
 es        | Flu Beach
(12 rows)

此示例演示了如何对原始表和您之前创建的视图 dd_view 调用 build_flextable_view

=> SELECT build_flextable_view ('darkdata', 'dd_view');
            build_flextable_view
-----------------------------------------------
 The view public.dd_view is ready for querying
(1 row)

再次查询该视图。您可以看到,函数用 darkdata_keys 表的内容填充了该视图。接下来,通过 key_name 列和它们的值,审阅结果中的一个代码段:

=> \x
Expanded display is on.
=> SELECT * FROM dd_view;
.
.
.
user.following                                           |
user.friends_count                                       | 791
user.geo_enabled                                         | F
user.id                                                  | 164464905
user.id_str                                              | 164464905
user.is_translator                                       | F
user.lang                                                | en
user.listed_count                                        | 4
user.location                                            | Uptown..
user.name                                                | Uptown gentleman.
.
.
.

请注意,创建视图时将存储列结构的定义。如果您在构建视图后将虚拟列提升为实际列,现有的视图定义不会更改。用 SELECT 语句查询此视图(如下所示),将仅返回 __raw__ 列中的值:

=> SELECT * FROM myflextable_view;

另请了解,提升虚拟列后重新构建视图,将改变所得的值。未来的查询将同时返回来自实际列和映射数据中的虚拟列的值。

使用 COMPUTE_FLEXTABLE_KEYS_AND_BUILD_VIEW

在一个步骤中,对 Flex 表调用此函数以计算 Flex 表键(请参阅计算 Flex 表键)并创建视图。