SQL:如何更新树内的值?

时间:2015-02-01 05:30:29

标签: sql postgresql psycopg2 ltree

正如标题所示,我很难过,猜测如何有效地更新多行中的值。该列使用数据类型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

提前致谢:)

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

Microsoft.BizTalk.Bam.EventObservation.OrchestrationEventStream.BeginActivity("someactivity", someID);
Microsoft.BizTalk.Bam.EventObservation.OrchestrationEventStream.UpdateActivity("someactivity", someID, "someProperty", someNamespace);
Microsoft.BizTalk.Bam.EventObservation.OrchestrationEventStream.EndActivity("someactivity", someID);

答案 2 :(得分:0)

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

我在两个请求中找到了一种方法:第一个请求将void UdpExample::HandleUdpReceive(otMessage *aMessage, const otMessageInfo *aMessageInfo) 的ltree路径修改为renderer.vr.isPresenting() ,第二个请求为{{1 }}。

这里是:

Android.Browser

答案 3 :(得分:0)

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

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

,URL为https://www.postgresql.org/docs/9.4/ltree.html

答案 4 :(得分:0)

我知道我参加这个聚会有点晚了。经过研究,我发现确实没有很好的方法和简单的方法来执行此操作。 I created the following user defined function that will get the job done

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