我正在尝试做一些看似简单的事情,但是找不到Denodo的VQL (虚拟查询语言)的正确语法。我在名为"location“的列中有这样一个字符串: XXXX-YYYY-ZZZZ- AAAA -BBBB,它的长度是可变的,我想要获取第四个集合的值(即本例中的AAAA)。我像这样使用Denodo split函数:
从my_table中选择SPLIT("-",location)3作为my_variable
然而,3不起作用。我尝试了一系列的变种:
选择SPLIT("-",location)3.value AS my_variable FROM my_table
选择SPLIT("-",location).column3 AS my_variable FROM my_table
等。
有人能帮我找出从数组中返回单个参数的正确语法吗?谢谢!
发布于 2019-09-12 13:06:06
SELECT field_1[3].string
FROM (SELECT split('-', 'XXXX-YYYY-ZZZZ-AAAA-BBBB') as field_1)您必须使用子查询来执行此操作,因为访问数组元素(即[<number>])的语法只能与字段名一起使用。您不能在表达式结果的旁边使用类似[4]的内容。
发布于 2019-09-11 04:34:56
这个问题很有帮助: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_datalocation_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列,从零开始。
https://stackoverflow.com/questions/57876974
复制相似问题