假设以下2 xml有效负载
<a>
<b>
<c>target value</c>
</b>
</a>
和
<a>
<c>target value</c>
<a>
是否可以使用ESQL检索标记<c>
的值,无论其出现的深度如何?我看过似乎建议使用select
语句的博客,但没有明确告诉我如何。
答案 0 :(得分:2)
您必须使用递归算法构建深度搜索。
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;
答案 1 :(得分:0)
'只有'一个选择语句不能用于此目的;它适用于数组,就好像数组中的每个元素都是表中的一行,每个元素中的每个字段都是一个列值。例如
select T1.phone from InputRoot.SomePath.contacts[] as T1;
正如Rafael建议的那样,递归函数是这种情况下的解决方案,但要注意树的可能深度,或者向Rafael代码添加if语句,以便在超出预定义限制时退出搜索路径。