You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在H2数据库中正确传递数组作为自定义函数参数?

解决H2数据库数组包含函数报错问题

错误原因

你遇到的Hexadecimal string contains non-hex character错误,是因为H2数据库不识别Array['HELLO', ...]这种数组写法——H2会把这种格式误解析为十六进制字符串(类似X'...'的语法),而字符串里的字母不是十六进制字符,因此抛出错误。

修正步骤

1. 正确创建函数别名

针对字符串数组场景,使用String[]作为参数类型(需支持其他类型可调整),函数内部将数组转为集合后调用containsAll:

CREATE ALIAS IF NOT EXISTS array_contains_all AS '
boolean arrayContainsAll(String[] sourceArray, String[] subArray) {
    java.util.Set<String> sourceSet = new java.util.HashSet<>(java.util.Arrays.asList(sourceArray));
    return sourceSet.containsAll(java.util.Arrays.asList(subArray));
}';

2. 使用H2合法的数组构造语法调用函数

H2中构造数组需要用ARRAY(...)语法(或CAST语法兼容旧版本):

-- 标准调用方式
SELECT array_contains_all(ARRAY('HELLO', 'WORLD', 'FRIEND'), ARRAY('HELLO', 'WORLD'));

-- 兼容旧版本H2的CAST写法
SELECT array_contains_all(CAST(('HELLO', 'WORLD', 'FRIEND') AS VARCHAR ARRAY), CAST(('HELLO', 'WORLD') AS VARCHAR ARRAY));

通用场景扩展

如果需要支持任意类型的数组,可将参数改为Object[],函数逻辑调整为:

CREATE ALIAS IF NOT EXISTS array_contains_all AS '
boolean arrayContainsAll(Object[] sourceArray, Object[] subArray) {
    java.util.Set<Object> sourceSet = new java.util.HashSet<>(java.util.Arrays.asList(sourceArray));
    return sourceSet.containsAll(java.util.Arrays.asList(subArray));
}';

调用时只需保证两个数组的元素类型一致即可。

内容的提问来源于stack exchange,提问作者Евгений Дорджиев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:31:11