类型 json 详细信息的 Postgres 无效输入语法:标记“%”无效
Postgres invalid input syntax for type json Detail: Token "%" is invalid
我正在尝试检查某些文本是否包含文本和 Postgres 数组中的值的串联,例如:
SELECT true from jsonb_array_elements('["a", "b"]'::jsonb) as ids
WHERE 'bar/foo/item/b' LIKE '%item/' || ids->>'id' || '%'
我收到以下错误:
ERROR: invalid input syntax for type json Detail: Token "%" is invalid. Position: 95 Where: JSON data, line 1: %...
如何使用数组的值,将它们与文本连接起来并检查 LIKE
表达式?
我已经尝试了几种显式添加像 ::jsonb
这样的转换的想法,但到目前为止还没有成功。
终于成功了,这是结果:
SELECT true from jsonb_array_elements_text('["a", "c"]'::jsonb) as ids
WHERE 'bar/foo/item/b' LIKE '%item/' || ids.value || '%'
关键的变化是使用 jsonb_array_elements_text
代替 jsonb_array_elements
和 ids.value
代替 ids->>'id'
问题是 ||
和 ->>
运算符具有相同的 precedence 并且是左关联的,因此表达式被解释为
(('%item/' || ids) ->>'id') || '%'
您必须添加括号:
'%item/' || (ids->>'id') || '%'
我正在尝试检查某些文本是否包含文本和 Postgres 数组中的值的串联,例如:
SELECT true from jsonb_array_elements('["a", "b"]'::jsonb) as ids
WHERE 'bar/foo/item/b' LIKE '%item/' || ids->>'id' || '%'
我收到以下错误:
ERROR: invalid input syntax for type json Detail: Token "%" is invalid. Position: 95 Where: JSON data, line 1: %...
如何使用数组的值,将它们与文本连接起来并检查 LIKE
表达式?
我已经尝试了几种显式添加像 ::jsonb
这样的转换的想法,但到目前为止还没有成功。
终于成功了,这是结果:
SELECT true from jsonb_array_elements_text('["a", "c"]'::jsonb) as ids
WHERE 'bar/foo/item/b' LIKE '%item/' || ids.value || '%'
关键的变化是使用 jsonb_array_elements_text
代替 jsonb_array_elements
和 ids.value
代替 ids->>'id'
问题是 ||
和 ->>
运算符具有相同的 precedence 并且是左关联的,因此表达式被解释为
(('%item/' || ids) ->>'id') || '%'
您必须添加括号:
'%item/' || (ids->>'id') || '%'