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

PostgreSQL中匹配错误jsonb格式的LIKE表达式为何返回false

为什么你的PostgreSQL LIKE查询匹配失败?

根本原因:LIKE默认把反斜杠当转义符

PostgreSQL的LIKE操作符默认会将反斜杠(\)解析为转义字符,而非普通字符串内容。你编写的匹配模式"[\"\\\"%\\\"\"]"里,大量反斜杠会被LIKE当作转义标记处理,导致实际生效的匹配规则和你预期的完全不一致,自然查不到结果。

举个例子,你测试语句里的模式"[\"\\\"%\\\"\"]",经过LIKE的转义解析后,实际变成了:

  • 开头是"
  • 接着是[
  • 然后是"(因为\\\"被解析成单个")
  • 然后是通配符%
  • 再是"(同样\\\"解析成")
  • 最后是]"

但你的目标字符串"[\"\\\"Foo\\\"\"]"里实际包含多个反斜杠,和解析后的模式完全不匹配,所以返回false。

解决办法

1. 给LIKE指定自定义转义符

在LIKE语句末尾添加ESCAPE子句,选择一个不会出现在目标字符串中的字符(比如#)作为转义符,这样反斜杠就会被当作普通字符处理:

-- 测试语句会返回true
select '"[\"\\\"Foo\\\"\"]"' like '"[\"\\\"%\\\"\"]"' escape '#';

-- 业务查询修改为
select * from foo where bar_json::text like '"[\"\\\"%\\\"\"]"' escape '#';

2. 使用正则表达式匹配

如果需要更灵活的匹配逻辑,可以用PostgreSQL的正则表达式操作符~,注意正则里的反斜杠需要额外转义一次:

-- 测试语句
select '"[\"\\\"Foo\\\"\"]"' ~ '^\["\\"%"\\"\]$';

-- 业务查询
select * from foo where bar_json::text ~ '^\["\\"%"\\"\]$';

3. 直接利用jsonb特性判断(推荐)

既然是jsonb列,没必要转成text硬匹配。错误值本质是把数组又套成了字符串类型的jsonb,你可以用jsonb_typeof直接判断类型:

select * from foo 
where jsonb_typeof(bar_json) = 'string'  -- 正确的数组类型应为'array'
and bar_json::text like '%"[%]"%' escape '#';

内容的提问来源于stack exchange,提问作者SpaceTrucker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:12:33