【问题标题】:Applying UPPER() function in SELECT FROM VIEW or in CREATE VIEW在 SELECT FROM VIEW 或 CREATE VIEW 中应用 UPPER() 函数
【发布时间】:2022-11-27 22:10:36
【问题描述】:

我在雪花中有一个观点:

CREATE OR REPLACE VIEW DATABASE.PUBLIC.ALL_TABLES(
    ID,
    CODE,
    VARID
) as
    Select  
      ID::string as ID,
      CODE::string as CODE,
      VARID::string as VARID,
    From 
        (SELECT ID, CODE, VARID FROM TABLE_A) union all
        (SELECT ID, CODE, VARID FROM TABLE_B) union all
        (SELECT ID, CODE, VARID FROM TABLE_C);

我需要从代码中的视图中选择 varid,但我需要将值转换为大写。

SELECT UPPER(varid) AS varid FROM DATABASE.PUBLIC.ALL_TABLES

但是,这会使查询扫描整个表以将 UPPER() 函数应用于每一行,从而增加扫描的字节数。从上面的视图中选择时,与其应用 UPPER() 函数,不如在视图中应用 UPPER() 函数更好,这样我就不需要每次从中选择时都应用 UPPER() 函数看法。

SELECT varid FROM DATABASE.PUBLIC.ALL_TABLES
CREATE OR REPLACE VIEW DATABASE.PUBLIC.ALL_TABLES(
    ID,
    CODE,
    VARID
) as
    Select  
      ID::string as ID,
      CODE::string as CODE,
      VARID::string as VARID,
    From 
        (SELECT ID, CODE, UPPER(VARID) AS VARID FROM TABLE_A) union all
        (SELECT ID, CODE, UPPER(VARID) AS VARID FROM TABLE_B) union all
        (SELECT ID, CODE, UPPER(VARID) AS VARID FROM TABLE_C);

【问题讨论】:

  • 你有问题吗?
  • @nbk 从视图外部选择时,在视图内应用 UPPER() 函数而不是应用 UPPER() 函数更好吗?
  • 在视图中,但为什么要将它们保存为小写呢?
  • 实际上,我认为它是在视图中还是在视图之外并不重要。执行查询时,探查器将确定何时最好应用 UPPER()。将它放在视图中的唯一原因是,如果您不希望任何使用该视图的人能够看到当前情况下的数据。如果您想让该选项对用户开放,请将其置于视图之外。您关于“扫描整个表格”的陈述也有点令人困惑,而不是 Snowflake 的工作原理。

标签: sql snowflake-cloud-data-platform sql-view


【解决方案1】:

Mike 已经指出了要点:如果您在视图定义中使用 UPPER,那么它将影响将访问该视图的所有用户。

关于性能,我认为仅当您使用 varid 列搜索数据时才重要,例如:

SELECT * FROM DATABASE.PUBLIC.ALL_TABLES where varid = 'XYZ';

在这种情况下,如果您使用 UPPER,那么 Snowflake 在过滤值时将需要应用 UPPER 函数,这可能会对性能产生负面影响。另一方面,如果您不确定数据的大小写,并且需要使用 UPPER 进行搜索,那么在 VIEW 或查询中定义它并不重要:

SELECT * FROM DATABASE.PUBLIC.ALL_TABLES where UPPER(varid) = 'XYZ';

如果此列仅用于投影(无过滤),则 UPPER 的位置无关紧要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2012-01-15
    • 2022-01-10
    相关资源
    最近更新 更多