我对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 ,它无论如何都会给我语法错误。
提前感谢大家!
答案 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开始的秒数;对于间隔值,是间隔中的总秒数