5

正如标题所示,我很难猜测如何有效地更新多行中的值。该列是用 data-type 实现的ltree。因此,应该有某种形式的特殊操作可用于此数据类型,postgresql下面是一个示例:

表的名称,比方说:product_sections包含这些值的列的名称是section_path (type: ltree)

Android
Android.Browser
Android.Browser.Test
Android.Browser.Compare.URL

在这里,我只想更新Browser到类似的Foo部分,这样数据就会变成这样:

Android
Android.Foo
Android.Foo.Test
Android.Foo.Compare.URL

提前致谢 :)

4

5 回答 5

2
update product_sections
set product_path = 'Android.foo'::lpath|| subpath(product_sections,2)) 
where product_path <@ 'Android.browser'::lpath

未经测试,但这应该会达到正确的结果。

于 2015-02-01T06:00:45.093 回答
0

上述错误在于将文本传输到 ltree 的函数使用不正确。我们应该使用 text2ltree(),sql 是

update tree_test
set path = text2ltree('Android.foo') || subpath(path,2))
where product_path <@ 'Android.browser';

网址是https://www.postgresql.org/docs/9.4/ltree.html

于 2019-06-12T12:24:45.913 回答
0

我的项目也有同样的需求。以前的答案对我不起作用,所以我将发布我的解决方案。

我在两个请求中找到了一种方法:第一个修改 to 的 ltree 路径,Android.Browser第二Android.Foo个修改Android.Browser.

他们来了 :

UPDATE product_sections SET product_path = 'Android.Foo'
       WHERE path = 'Android.Browser';
UPDATE product_sections SET product_path = 'Android.Foo'
       || subpath(product_path, nlevel('Android.Browser')) 
       WHERE product_path ~ 'Android.Browser.*{1,}';
于 2018-11-05T14:34:53.343 回答
0

对于动态结果,您可以使用 nlevel 函数作为子路径参数(未经测试):

update product_sections
set product_path = 'Android.foo'::lpath|| subpath(product_sections,nlevel('Android.foo'))) 
where product_path <@ 'Android.browser'::lpath
于 2017-05-16T01:24:18.667 回答
0

我意识到我参加这个聚会有点晚了。经过我的研究,我发现确实没有好的方法和简单的方法可以做到这一点。我创建了以下用户定义的函数来完成工作

SELECT '44.22.23'::TEXT::LTREE AS orginal
      , ltree_swap('44.22.23'::TEXT::LTREE,'23'::TEXT::LTREE,'fish'::TEXT::LTREE,2) AS swap

 --=========RESULT SET=========--
-- orginal    swap
-- 44.22.23   44.22.fish
于 2019-11-14T18:58:19.027 回答