1

我在 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之类的东西,无论如何它都会给我语法错误。

提前谢谢大家!

4

2 回答 2

2

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

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

返回正确的结果。

无论如何,错误信息非常具有误导性。

于 2017-10-18T15:20:08.993 回答
0

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

PostgreSQL 日期/时间函数和运算符
epoch
对于带有时区值的时间戳,自 1970-01-01 00:00:00 UTC 以来的秒数(可以是负数);对于日期和时间戳值,自当地时间 1970-01-01 00:00:00 以来的秒数;对于间隔值,间隔中的总秒数

于 2020-04-16T10:08:06.753 回答