Hasura是否支持PostgreSQL integer[]类型的contains筛选?求启用方法
解决Hasura视图中integer[]类型列的contains筛选问题
针对你遇到的Hasura不支持视图中integer[]列contains筛选的问题,有以下几种可行方案:
方案1:添加计算字段实现contains逻辑
通过PostgreSQL函数封装数组包含判断逻辑,再在Hasura中将其作为视图的计算字段,即可用于筛选:
- 创建判断数组包含的SQL函数:
CREATE OR REPLACE FUNCTION check_array_contains(view_row your_view_name, target_ids integer[]) RETURNS boolean AS $$ BEGIN RETURN view_row.your_integer_array_column @> target_ids; END; $$ LANGUAGE plpgsql STABLE;
- 在Hasura控制台进入该视图的「Modify」页面,添加计算字段,关联上述函数。
- 之后即可在GraphQL查询中通过该计算字段筛选,示例:
query FilterViewByArrayContains { your_view_name( where: { check_array_contains: { _eq: true } }, args: { target_ids: [2, 5, 7] } ) { id your_integer_array_column other_columns } }
方案2:使用Hasura的_expr筛选器直接写SQL表达式
如果允许使用自定义SQL表达式,可以开启Hasura的相关权限后,直接在查询中使用数组包含运算符@>:
- 在Hasura控制台的「Settings」→「GraphQL」中,开启
Allow Inline Boolean Expressions;或者在对应角色的权限设置中,允许使用_expr运算符。 - 编写查询时直接传入SQL表达式:
query FilterViewByArrayExpr { your_view_name( where: { _expr: { sql: "your_integer_array_column @> :target_ids" } }, args: { target_ids: [1, 3] } ) { id your_integer_array_column } }
方案3:将视图转为物化视图并添加索引(可选优化)
如果视图数据更新不频繁,可以转为物化视图并添加GIN索引提升筛选性能,再结合上述方案使用:
CREATE MATERIALIZED VIEW your_materialized_view AS SELECT * FROM your_original_view; CREATE INDEX idx_array_column ON your_materialized_view USING GIN(your_integer_array_column);
之后在Hasura中同步该物化视图,再使用方案1或2的筛选逻辑即可。
内容的提问来源于stack exchange,提问作者Han Che
相关产品推荐
相关产品推荐

