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

如何用GraphQL查询PostgreSQL jsonb全字段文本?解决_ilike报错

解决方案

问题原因

_ilike 是针对文本类型的模糊匹配操作符,而 jsonb 类型的比较表达式(jsonb_comparison_exp)不支持该操作符,直接使用会报错。需要将 jsonb 转换为文本,或者使用 jsonb 专属的匹配方式实现需求。


方案1:将jsonb转为文本后使用_ilike(适用于Hasura等支持类型转换的GraphQL引擎)

通过 _cast 将 jsonb 转为文本类型,再用 _ilike 做模糊匹配,注意要加通配符 % 实现包含匹配:

query {
  declarations(where: {data: {_cast: {_text: {_ilike: "%Sergey%"}}}}) {
    id
    data
  }
}

方案2:自定义PostgreSQL函数实现匹配

先在PostgreSQL中创建一个函数,判断jsonb的文本形式是否包含指定关键词:

CREATE OR REPLACE FUNCTION jsonb_contains_text(jsonb_data jsonb, search_text text)
RETURNS boolean AS $$
BEGIN
  RETURN jsonb_data::text ILIKE '%' || search_text || '%';
END;
$$ LANGUAGE plpgsql IMMUTABLE;

然后在GraphQL中调用该函数(以Hasura为例):

query {
  declarations(where: {_expr: {name: "jsonb_contains_text", args: ["$data", "Sergey"]}}) {
    id
    data
  }
}

方案3:使用JSON路径精准匹配(推荐)

利用PostgreSQL的JSON路径功能,匹配jsonb中任意字段的值是否包含指定关键词(不区分大小写),Hasura支持通过_jsonpath操作符实现:

query {
  declarations(where: {data: {_jsonpath: "$.* like_regex 'Sergey' flag 'i'"}}) {
    id
    data
  }
}

该方式只会匹配字段的值,不会误匹配json结构中的符号(如引号、冒号),比转文本更精准。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:52:38