2

ltree如何从Postgres 表中删除特定标签?我有桌子吗?

测试表:

CREATE TABLE tbl (sno int, path ltree, userid int);

INSERT INTO tbl (sno, path, userid)
VALUES
  (1, '123',             123)
, (2, '123.101',         123)
, (3, '123.101.103',     123)
, (4, '123.101.103.105', 123)
, (5, '123.101.103.107', 123)
, (6, '123.102.104.106', 123)
, (7, '123.102.104.108', 123)
, (8, '123.102.104',     123)
, (9, '123.102',         123);

我想将 a 传递userid给查询,以将其从path表中的每一个中删除。例如,如果我通过101123.101.103则应更新为123.103.

是否可以直接执行此操作?还是应该path使用路径替换功能进行更新?

我从 PHP 中尝试了以下选择查询,但它返回以下错误。相同的查询在 phpPgAdmin 中正常工作!?

询问:

$selectPathq=pg_query($con,"select path from myschema.test where path @ '101'")
             or die('could not connect: '. pg_last_error($con));

错误:

could not connect:
ERROR: operator does not exist: myschema.ltree @ unknown at character 63
HINT: No operator matches the given name and argument type(s).
      You might need to add explicit type casts.
4

1 回答 1

7

解决错误

要使用数据类型ltree和相关功能,您需要安装附加模块ltree

默认情况下,附加模块会安装到 schemapublic中。如果您的当前设置search_path不包括 schema public,则找不到 ltree 运算符。您的错误消息暗示了这个方向:

ERROR: operator does not exist: myschema.ltree @ unknown at character 63 

要验证,模式限定 ltree 运算符@

SELECT path FROM tbl WHERE path operator(public.@) '101';

它现在有效吗?
如果这是问题的根源,您也可以search_path正确设置。检查:

SHOW search_path;

设置:

SET search_path = public; -- add more schemas as needed

关于search_path.

更新路径

如果我正确阅读了您的问题并且您想从所有行的路径中删除某个项目:

UPDATE tbl t
SET    path = nu.path
FROM  (
   WITH x AS (
      SELECT sno, path, index(path, '101') AS i
      FROM   tbl
      WHERE  path ~ '*.101.*'
      )
   SELECT sno
        , subpath(path, 0, i)
          || CASE WHEN nlevel(path) > i+1 THEN subpath(path, i+1)
                  ELSE '' END AS path
   FROM x
   ) nu
WHERE nu.sno = t.sno;

(注意,由于pathis type ltree,表达式中的~操作path ~ '*.101.*'不是正则表达式匹配操作符,而是一个特殊的 ltree 匹配操作符,右边的项被认为是 type lquery。它匹配任何包含 label 的标签路径101。)

这会给你留下一条你刚刚拥有的空路径101。您可以将其放入触发器AFTER DELETE中以从所有行中清除某个项目。

于 2012-12-26T07:32:04.740 回答