如何从 Postgres 表中的 ltree 中删除特定标签?

Ram*_*sad 2 sql postgresql tree sql-update postgresql-9.1

如何从ltreePostgres 表中删除特定标签?我有一张桌子?

测试表:

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);
Run Code Online (Sandbox Code Playgroud)

我想将 a 传递userid给查询,以将其从path表中的每个中删除。例如,如果我通过了101,那么123.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));
Run Code Online (Sandbox Code Playgroud)

错误:

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.
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 7

解决错误

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

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

ERROR: operator does not exist: myschema.ltree @ unknown at character 63 
Run Code Online (Sandbox Code Playgroud)

要验证,架构限定 ltree 运算符@

SELECT path FROM tbl WHERE path operator(public.@) '101';
Run Code Online (Sandbox Code Playgroud)

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

SHOW search_path;
Run Code Online (Sandbox Code Playgroud)

设置:

SET search_path = public; -- add more schemas as needed
Run Code Online (Sandbox Code Playgroud)

关于search_path.

更新路径

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

ERROR: operator does not exist: myschema.ltree @ unknown at character 63 
Run Code Online (Sandbox Code Playgroud)

(注意,由于path是类型ltree,操作者~在表达式path ~ '*.101.*'正则表达式匹配操作者,而是一种特殊ltree匹配运算,而右术语取为类型的lquery,它含有标签的任何标签路径相匹配101。)

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