含'+'字符的Hasura GraphQL JSONB查询无结果排查求助
解决Hasura查询JSONB列含'+'字符串无结果的问题
问题根源
核心问题是正则表达式中的'+'属于特殊元字符,未转义时会被解析为「匹配前面字符1次或多次」,而非字面意义的'+'符号,导致查询无法匹配目标字符串;同时直接用字符串匹配JSONB的方式不够精准,容易触发特殊字符的解析异常。
解决方案
以下是按优先级排序的可行修复方式:
1. 直接匹配JSONB子键(最优方案)
如果Hasura已追踪JSONB列fields的payment_pix_code子字段,可直接用_eq精准匹配:
query myQuery { deal_search(where: { fields: { payment_pix_code: { _eq: "00020126360014BR+B1" } } }) { name } }
若Hasura未自动识别子字段,可在控制台为fields列添加JSONB子字段追踪,或用原生SQL表达式匹配:
query myQuery { deal_search(where: { _expr: "fields ->> 'payment_pix_code' = '00020126360014BR+B1'" }) { name } }
2. 使用JSONB的_contains运算符
传入正确的JSON结构而非字符串,规避特殊字符干扰:
query myQuery { deal_search(where: { fields: { _contains: { payment_pix_code: "00020126360014BR+B1" } } }) { name } }
3. 修复正则表达式的转义
必须对'+'进行双重转义(GraphQL字符串中需用\\+表示字面意义的\+):
query myQuery { deal_search(where: { fields: { _cast: { String: { _iregex: "\"payment_pix_code\": \"00020126360014BR\\+B1\"" } } } }) { name } }
重要说明
- 优先选用JSONB原生匹配运算符(
_eq/_contains),比正则表达式更高效且不易出错。 - 正则表达式中的特殊字符(如
+、*、.等)必须转义才能匹配字面意义,在GraphQL字符串中需额外添加一个反斜杠完成转义。
内容的提问来源于stack exchange,提问作者Igor Leonir
相关产品推荐
相关产品推荐

