使用 Denodo (VQL) 选择数组中的参数值

问题描述 投票:0回答:3

我正在尝试做一些看似简单但无法找到 Denodo 的 VQL(虚拟查询语言)的正确语法的事情。我有一个像这样的字符串: XXXX-YYYY-ZZZZ-AAAA-BBBB 在一个名为“location”的列中,长度各不相同,我想获取第四组的值(即本例中的 AAAA)。我正在使用 Denodo split 函数,如下所示:

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

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

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

从 my_table 中选择 SPLIT("-",location).column3 AS my_variable

等等

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

arrays split denodo
3个回答
3
投票
SELECT field_1[3].string 
FROM (SELECT split('-', 'XXXX-YYYY-ZZZZ-AAAA-BBBB') as field_1)

您必须使用子查询来执行此操作,因为访问数组元素的语法(即

[<number>]
)只能与字段名称一起使用。您不能在表达式结果旁边使用类似
[4]
的内容。


0
投票

这个问题有帮助: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 列,从零开始。


0
投票

您可以使用正则表达式函数,因为它会给出您正在寻找的确切值。 函数语法类似于 regex(field, '\w+-\w+-\w+-(\w+), '$1'),因此它返回准确的第四组值

© www.soinside.com 2019 - 2024. All rights reserved.