如何从Postgres表的ltree中删除特定标签?我有一张桌子:
test(sno integer, path ltree, userid integer)
如果我在查询中将userid作为参数传递,它将删除所有路径中所有匹配的标签。如何做到这一点?
试验台:
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);
示例:如果我传递一个userid,它将从表中的所有路径中删除所有这个userid。是否可以直接这样做?还是应该使用路径替换函数更新路径?
我从PHP中尝试以下select查询,它返回以下错误。相同的查询在phpPgAdmin sql查询中正常工作)。
查询:
$selectPathq=pg_query($con,"select path from myschema.test where path @ '101'")
or die('could not connect: '. pg_last_error($con));
错误:
无法连接:错误:运算符不存在:MyStudio.LtReal@未知字符63提示:没有操作符匹配给定的名称和参数类型(s)。您可能需要添加显式类型转换。
最佳答案
修正错误
要使用数据类型ltree
和相关功能,需要安装附加模块ltree
。
默认情况下,其他模块安装到架构public
。如果当前的search_path
设置不包括架构,则找不到ltree运算符。您的错误消息提示了以下方向:
错误:操作符不存在:字符63中的MyStudio.LtRead未知
要验证,schema限定ltree运算符:
SELECT path FROM tbl WHERE path operator(public.@) '101';
现在有用吗?
如果这是问题的根源,您还可以正确设置
public
。核对:SHOW search_path;
设置为:
SET search_path = public; -- add more schemas as needed
The manual about
@
.更新路径
如果我正确阅读了您的问题,并且您希望从所有行的路径中删除某个项目:
UPDATE tbl t
SET path = nu.path
FROM (
WITH x AS (
SELECT sno, path, index(path, '123') AS i
FROM tbl
WHERE path ~ '*.123.*'
)
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;
这将给您留下一个只有
search_path
的空路径。您可以将其放入触发器search_path
中,从所有行中清除某个项目。