我想知道是否有任何方法可以根据xpath结果的某种类型转换来创建索引。特别是一个整数索引,但我也可以想象日期,浮点等。即使它是实验性的或将来的postgres ...或其他数据库的未来版本。我已经看过eXistdb,它远远没有准备好生产。
一些测试XML:
<?xml version="1.0"?>
<book>
<isbn>1</isbn>
<title>Goldfinger</title>
<author>Ian Fleming</author>
</book>
我能用这样的表和索引获得非常令人满意的结果。
Table "public.test"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+---------------------------------------------------+----------+--------------+-------------
id | integer | not null default nextval('test_id_seq'::regclass) | plain | |
num | integer | | plain | |
data | xml | | extended | |
Indexes:
"test_pkey" PRIMARY KEY, btree (id)
"test_title_index" btree (((xpath('/book/title/text()'::text, data))[1]::text))
用于查询,例如:
SELECT *
FROM test
WHERE (xpath('/book/title/text()', data))[1]::text = 'Goldfinger';
但是模式中有数据,非文本索引会更有意义。例如(我知道这是无效的,但它说明了这一点):
SELECT *
FROM test
WHERE (xpath('/book/isbn/text()', data))[1]::int BETWEEN 5 AND 10;
一点背景:
我正在尝试在postgres中存储XML文档,因为我有一个应用程序,其中主要数据类型已经是XML格式,并且通常需要像这样检索。模式可能非常复杂,因此将它们拆分为数据库列非常耗时,尤其是在模式发展时。我只提到这一点,因为我怀疑对我的问题的逻辑反应将是“将数据分解为原生列”。
答案 0 :(得分:2)
您可以为自己想要的任何内容创建indexes on expressions。没有直接从xml
转换为integer
,但您可以通过text
。数据库还抱怨语法创建索引,直到我用括号做了一点点。
最后,我让这个工作:
CREATE TABLE books (id integer, data xml)
CREATE INDEX books_isbn ON BOOKS (((((xpath('/book/isbn/text()', data))[1])::text)::integer));