假设以下 2 个 xml 有效负载
<a>
<b>
<c>target value</c>
</b>
</a>
和
<a>
<c>target value</c>
<a>
是否可以使用 ESQL 来检索 tag<c>
的值,而不管它出现的深度如何?我看过似乎建议使用该select
声明的博客,但没有一个明确向我展示如何使用。
假设以下 2 个 xml 有效负载
<a>
<b>
<c>target value</c>
</b>
</a>
和
<a>
<c>target value</c>
<a>
是否可以使用 ESQL 来检索 tag<c>
的值,而不管它出现的深度如何?我看过似乎建议使用该select
声明的博客,但没有一个明确向我展示如何使用。
您必须使用递归算法构建深度搜索。
CREATE FUNCTION NavigateTree(IN root REFERENCE) RETURNS CHAR BEGIN
DECLARE element REFERENCE TO root;
MOVE element FIRSTCHILD;
WHILE LASTMOVE(element) DO
DECLARE nameField CHARACTER FIELDNAME(element);
-- Cechar element
IF nameField = 'c' THEN
-- Return the Value
RETURN element;
ELSE
IF CheckLeaf(element) IS FALSE THEN
DECLARE child REFERENCE TO element;
MOVE child FIRSTCHILD;
RETURN NavegarArvore(child);
END IF;
MOVE element NEXTSIBLING;
END IF;
END WHILE;
RETURN NULL;
END;
CREATE FUNCTION CheckLeaf(IN element REFERENCE) RETURNS BOOLEAN BEGIN
DECLARE leaf BOOLEAN FALSE;
DECLARE elemCheck REFERENCE TO element;
MOVE elemCheck FIRSTCHILD;
IF LASTMOVE(elemCheck) IS FALSE THEN
SET leaf = TRUE;
END IF;
RETURN leaf;
END;
'Only' 选择语句不适用于此目的;它适用于数组,就好像数组中的每个元素都是表中的一行,每个元素内的每个字段都是一个列值。例如
select T1.phone from InputRoot.SomePath.contacts[] as T1;
正如 Rafael 建议的那样,递归函数是这种情况下的解决方案,但请注意树的可能深度,或者在 Rafael 代码中添加 if 语句以退出搜索路径,如果它超过了预定义的限制。