在Postgresql 9.6.5上使用ltree进行查询时出现语法错误

时间:2017-10-18 14:44:48

标签: sql postgresql ltree

我对Postgresql 9.6.5上的ltree扩展有问题

我有一个名为category的表,带有以下DDL(我简化了一下):

CREATE TABLE dictionary.category
(
    id serial not null constraint category_pkey primary key,
    name text not null,
    parent_id integer constraint category_parent_id_fkey references dictionary.category
);

创建ltree扩展后:

CREATE EXTENSION ltree;

我正试图进行一些查询,例如:

SELECT id, text2ltree(name) FROM dictionary.category;

SELECT id, name::ltree FROM dictionary.category;

或转义列名称

SELECT id, text2ltree("name") FROM dictionary.category;

它给了我:

ERROR:  syntax error at position 12
始终

但是当我尝试时:

SELECT id, text2ltree('a.b.v') FROM dictionary.category;

SELECT id, text2ltree(id::text) FROM dictionary.category

它给了我正确的结果。

我认为这与名称是保留关键字的事实有关。但为什么逃避不起作用?另外,我试图将列重命名为 abcd ,它无论如何都会给我语法错误。

提前感谢大家!

2 个答案:

答案 0 :(得分:1)

回答我自己的问题。看来这些错误消息与查询本身无关。它与可以包含在ltree路径中的文本相关。似乎l树路径只允许使用alfanumeric字符,仅此而已。

SELECT id, text2ltree(regexp_replace(name, '[^[:alpha:]]', '', 'g')) FROM dictionary.category;

返回正确的结果。

无论如何,错误信息非常容易引起误解。

答案 1 :(得分:0)

我们遇到了同样的问题。我们使用extract(epoch FROM date_start)从日期列中生成LTREE,但是我们的一条记录返回了负数。

PostgreSQL Date/Time Functions and Operators
时代
对于具有时区值的时间戳记, 自1970-01-01 00:00:00 UTC 起的秒数(可以为负);对于日期和时间戳记值,自当地时间1970-01-01 00:00:00开始的秒数;对于间隔值,是间隔中的总秒数