如何在h2中收回和更新数组中的值?

因为我试图管理数组中Set个不同的值,所以我不知道值在数组中的顺序/位置,所以可以 因此,只按值操作,而不使用值在数组中的位置-如果可能的话?

(我可以忍受数组中的重复值,因为我将查询的数组值加载到Set中,这将自动过滤掉重复值.)

我可以使用串联添加一个值:

DROP TABLE A IF EXISTS;
CREATE TABLE A(id INT PRIMARY KEY AUTO_INCREMENT, ints INT ARRAY);
INSERT INTO A(ints) VALUES (ARRAY[1, 2]);
SELECT ints FROM A WHERE id = 1;
// [1, 2]

// Concatenate
UPDATE A SET ints = ints || 3;
SELECT ints FROM A WHERE id = 1;
// [1, 2, 3]

但我如何才能收回一个特定值呢?

// How to retract 2?
UPDATE A SET ints = ???;
SELECT ints FROM A WHERE id = 1;
// [1, 3]

// Or, how to retract 1 and 2?
UPDATE A SET ints = ???;
SELECT ints FROM A WHERE id = 1;
// [3]

如何将一个值更新为另一个值?

// How to replace 1 with 10?
UPDATE A SET ints = ???;
SELECT ints FROM A WHERE id = 1;
// [10, 2, 3]

// Or, how to replace 1 with 10 and 3 with 30?
UPDATE A SET ints = ???;
SELECT ints FROM A WHERE id = 1;
// [10, 2, 30]

我try 了各种解嵌套值的方法,并对它们进行过滤以排除(收回)某些值,然后沿着以下(错误的)行将它们聚合回来,但没有成功:

UPDATE A 
SET ints = ARRAY_AGG(
   (SELECT * FROM UNNEST(SELECT ints FROM A) WHERE c1 != 2)
) 
WHERE id = 1;

更新:我可以获得所需的筛选值:

SELECT * FROM UNNEST(SELECT ints FROM A) where c1 != 2;
// C1
// 1
// 3

但是,我无法从这些值创建数组(我可以将其设置为ints):

VALUES ARRAY(
   SELECT * FROM UNNEST(SELECT ints FROM A) where c1 != 2
);
// C1
// [null, null]

推荐答案

// How to retract 2?
UPDATE A SET ints = ARRAY(SELECT V FROM TABLE(V INT = (SELECT ints FROM A WHERE id = 1)) where V != 2);
SELECT ints FROM A WHERE id = 1;
// [1, 3]


// How to replace 1 with 10?
UPDATE A SET ints = ARRAY[1, 2, 3];
SELECT ints FROM A WHERE id = 1;
UPDATE A SET ints = ARRAY(SELECT CASEWHEN(V=1, 10, V) FROM TABLE(V INT = (SELECT ints FROM A WHERE id = 1)));
SELECT ints FROM A WHERE id = 1;
// [10, 2, 3]

Java相关问答推荐

将具有多个未知字段的SON映射到Java POJO

当切换javaFX场景时,stage的大小正在Minimize

流迭代列表<;对象>;上的NoSuchElementException

如何打印本系列的第n项y=-(1)-(1+2)+(1+2+3)+(1+2+3+4)-(1+2+3+4+5)...Java中的(1+2+3+4...+n)

为什么不应用类型推断?

呈现文本和四舍五入矩形时出现的JavaFX窗格白色瑕疵

Spark忽略Iceberg Nessie目录

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

无法使用ApacheSpark依赖项构建JavaFX应用程序

带错误BER验证的itext8签名返回pdf

MySQL数据库中未应用具有Spring数据的唯一约束

Docker不支持弹性APM服务器

如何在Cosmos DB(Java SDK)中增加默认响应大小

当构造函数创建一个新实例时,Java为什么需要&new";

FETCH类型设置为LAZY,但它仍会发送第二个请求

无法使用Java PreparedStatement在SQLite中的日期之间获取结果

将双倍转换为百分比

泛型与泛型问题的完美解决方案?

在实例化中指定泛型类型与不指定泛型类型之间的区别

使用StringBuilder和append方法创建字符串时Java字符串内部方法的问题