【问题标题】:Select Value of Parameter in Array with Denodo (VQL)使用 Denodo (VQL) 选择数组中的参数值
【发布时间】:2019-09-12 13:06:06
【问题描述】:

我正在尝试做一些看似简单但找不到适合 Denodo 的 VQL(虚拟查询语言)的语法的事情。我有一个这样的字符串:XXXX-YYYY-ZZZZ-AAAA-BBBB 在名为“位置”的列中,长度不同,我想获取第四组的值(即本例中的 AAAA)。我正在使用这样的 Denodo 拆分功能:

SELECT SPLIT("-",location)[3] AS my_variable FROM my_table

但是,[3] 不起作用。我尝试了很多变体:

SELECT SPLIT("-",location)[3].value AS my_variable FROM my_table

SELECT SPLIT("-",location).column3 AS my_variable FROM my_table

等等

有人可以帮我找出从数组中返回单个参数的正确语法吗?谢谢!

【问题讨论】:

    标签: arrays split denodo


    【解决方案1】:
    SELECT field_1[3].string 
    FROM (SELECT split('-', 'XXXX-YYYY-ZZZZ-AAAA-BBBB') as field_1)
    

    您必须使用子查询来执行此操作,因为访问数组元素的语法(即[<number>])只能与字段名称一起使用。您不能在表达式结果旁边使用 [4] 之类的东西。

    【讨论】:

    • @greenbellpepper 如果您支持我的回答,我将不胜感激 :)
    • 如果数组长度不同,你想选择最后一项,可以是 [4]、[5] 或 [6]。有没有办法总是选择最后一块?
    • @luanstat 这是我想到的最好的WITH v AS (SELECT split('-', 'XXXX-YYYY-ZZZZ-AAAA-BBBB') as field_1) SELECT last(string) FROM FLATTEN test_flatten AS V (V.field_1);
    【解决方案2】:

    这个问题有帮助:https://community.denodo.com/answers/question/details?questionId=90670000000CcQPAA0

    我通过创建一个将数组保存为字段的视图使其工作:

    CREATE OR REPLACE VIEW p_sample_data FOLDER = '/stack_overflow' 
    AS SELECT bv_sample_data.location AS location
    , bv_sample_data.id AS id
    , split('-', location) AS location_array 
    FROM bv_sample_data;
    

    注意我创建了一个名为location_array的列?

    现在您可以在视图顶部使用 select 语句来提取您想要的信息:

    SELECT location, id, location_array[2].string
    FROM p_sample_data
    

    location_array[2] 是第三个元素,.string 告诉 denodo 你想要字符串值(我认为这就是它的作用......你必须在文档中阅读有关复合值的更多信息:https://community.denodo.com/docs/html/browse/6.0/vdp/vql/advanced_characteristics/management_of_compound_values/management_of_compound_values )

    另一种可能的方法是使用数组创建一个视图,然后将数组展平,尽管我没有尝试过该选项。

    更新:我尝试创建一个扁平化数组的视图,然后使用分析(或“窗口”)函数来获取 row_number() OVER (PARTITION BY id order by ID ASC),但分析/窗口函数不适用于平面文件源。

    因此,如果您采用“扁平化”路线并且您的源系统无法使用分析功能,您可以直接使用 rownum() 函数,但您必须按您想要的列号偏移值,然后用余数除法取出你想要的数据。

    像这样:

    --My view with the array is called p_sample_data
    CREATE OR REPLACE VIEW f_p_sample_data FOLDER = '/stack_overflow' AS 
    SELECT location AS location
       , id AS id
       , string AS string
       , rownum(2) AS rownumber 
    FROM FLATTEN p_sample_data AS v ( v.location_array);
    

    现在,使用 rownum() 函数(偏移量为 2),我可以在 where 子句中使用余数除法来获取我想要的数据:

    SELECT location, id, string, rownumber
    FROM f_p_sample_data
    WHERE rownumber % 5 = 0
    

    坦率地说,我认为更简单的方法是将您的位置数据留在数组中,并使用 location_array[2].string 语法提取第 n 列,其中 2 是第 n 列,从零开始。

    【讨论】:

      猜你喜欢
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      相关资源
      最近更新 更多