gpt4 book ai didi

Postgresql:比较两个数组但包括顺序

转载 作者:行者123 更新时间:2023-11-29 11:46:20 29 4
gpt4 key购买 nike

我希望比较 Postgres 查询中的两个数组,当第一个数组嵌入第二个数组时返回 true。较小的数组可以出现在较大数组中的任何一点。它可能最好用一个例子来展示。对于以下内容,*cmp*是我希望找到的神奇运算符。

{b,c}   *cmp* {a,b,b,c,d} -- true
{b,d} *cmp* {a,b,b,c,d} -- false
{a,b,b} *cmp* {a,b,b,c,d} -- true
{a,b} *cmp* {a,b,b,c,d} -- true
{a,b,c} *cmp* {a,b,b,c,d} -- false

我知道 <@运算符,这是一个好的开始,但没有考虑元素的顺序。

   {b,d} <@ {a,b,b,c,d} -- true, but I want false

我的代码中有一个非常丑陋的解决方法(perl 的 DBD::Pg 使用“?”作为占位符)

array_values::text similar to '%({|,)' || ? || '(,|})%'

似乎可行,但我希望能够在此处使用索引。只要在文本表示中使用引号,它也会失败,但幸运的是,我的用例不会发生这种情况。我错过了一个技巧吗?

编辑

我可能应该举出更好的例子。还有一些

{bb,c}   *cmp* {a,b,bb,c,d} -- true
{b,c} *cmp* {a,b,bb,c,d} -- false
{a,b,bb} *cmp* {a,b,bb,c,d} -- true
{a,b,b} *cmp* {a,b,bb,c,d} -- false
{c,d} *cmp* {a,b,bb,c,d} -- true

最佳答案

可以在不比较文本版本的情况下执行此操作。我不确定性能是否会更好。基本上,检查使用 @> 运算符作为快速失败(希望如此),然后在测试数组中查找数组的第一项。从该位置开始抓取一个切片,看看它是否与测试数组相同。

CREATE TABLE test (a text[]);
INSERT INTO test VALUES ('{bb,c}'), ('{b,c}'), ('{a,b,bb}'), ('{a,b,b}'), ('{c,d}');
SELECT a,
'{a, b, bb, c, d, b}' @> a AND (
SELECT bool_or(
('{a, b, bb, c, d, b}'::text[])[x:(x+array_length(a,1) - 1)] = a
)
FROM unnest(array_positions('{a, b, bb, c, d, b}', a[1])) as pos(x)
)
FROM test;
a | ?column?
----------+----------
{bb,c} | t
{b,c} | f
{a,b,bb} | t
{a,b,b} | f
{c,d} | t

我在测试数组中添加了一个额外的“b”,因此 array_positions 会为第二个测试返回多个结果。

关于Postgresql:比较两个数组但包括顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58816741/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com