【问题标题】:How to index name of an element in xml column in Postgres如何在 Postgres 的 xml 列中索引元素的名称
【发布时间】:2021-12-17 02:18:45
【问题描述】:

我正在尝试索引元素的名称,但一直遇到此错误

ERROR: set-returning functions are not allowed in index expressions

这是我迄今为止尝试过的。

示例 xml:

<book><title>Manual</title><chapter>1</chapter></book>

DDL:

CREATE INDEX test2_element_name_idx
ON test2 USING GIN(xpath('local-name(/*)',unnest(xpath('//book/*', xml_data))));

是否可以对元素名称进行索引?最后我想索引&lt;book&gt;(即&lt;title&gt; &lt;chapter&gt;)下的所有元素

其中一个示例用例是,我想查询(使用 xpath)以了解有多少书有标题。而且我相信索引它会使查询更有效率。如果我的理解不正确,请纠正我。

【问题讨论】:

  • 不能索引返回多行的函数调用。

标签: sql xml postgresql


【解决方案1】:

a_horse_with_no_name 声明,您不能使用返回多行的函数来索引表。相反,您可以做的是使用函数返回的多行构建一个数组。我在这里提出了一个可能需要调整的解决方案,因为我从未使用过 xml 数据类型和函数(json 更好:-):

CREATE OR REPLACE FUNCTION xml_data_agg(xml_data xml)
RETURNS xml[] LANGUAGE sql AS
$$
  SELECT array(SELECT xpath('local-name(/*)',unnest(xpath('//book/*', xml_data)))) ;
$$ ;

CREATE INDEX test2_element_name_idx
ON test2 USING GIN(xml_data_agg(xml_data));

然后您可以在可以放置此类 where 子句的查询中使用此索引:WHERE xml_data_agg(xml_data) @&gt; array[list_of_the_xlm_elements_to_be_searched]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多