Postgresql Postgres类型json详细信息的输入语法无效:Token";%&引用;无效

Postgresql Postgres类型json详细信息的输入语法无效:Token";%&引用;无效,postgresql,sql-like,jsonb,Postgresql,Sql Like,Jsonb,我试图检查某些文本是否包含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.

我试图检查某些文本是否包含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
表达式


我已经尝试过几种显式添加cast的方法,比如
::jsonb
,但到目前为止没有成功

最终实现了这一点,结果如下:

SELECT true from jsonb_array_elements_text('["a", "c"]'::jsonb) as ids 
WHERE 'bar/foo/item/b' LIKE '%item/' || ids.value || '%'

关键的变化是使用
jsonb_数组_元素
而不是
jsonb_数组_元素
ids.value
而不是
ids->'id'
问题是
|
->
操作符具有相同的属性并且保持关联,因此表达式被解释为

(('%item/' || ids) ->>'id') || '%'
您必须添加括号:

'%item/' || (ids->>'id') || '%'

“bar/foo/item/b”类似于“%item/”| | NULLIF(“”,ids->“id”)| |“%”@Rhim,它实际上删除了错误,但不起作用,值总是变为空,表达式的计算结果为true我尝试了该解决方案,但它给出了空结果:
从jsonb数组元素(“[“a”,“b”]::jsonb)中选择true作为id,其中“bar/foo/item/b”类似于“%item/”| | |(ids->>“id”)| |“%”
是,但这就是错误消息的原因。您的查询可能还有其他问题。但你现在有了解决办法。你说得对,谢谢你的帮助,我是博士后的新手。我仍然不明白为什么使用jsonb_数组_元素_文本会连接值,而使用jsonb_数组_元素则不会。我想我的问题的正确答案是你的,我只是想理解为什么它不能像我期望的那样工作,所以你可以编辑它来接受:)。正如我在文档中看到的,jsonb_数组_元素:将JSON数组扩展为一组JSON值和jsonb_数组_元素_文本:将JSON数组扩展为一组文本值,应该使用文本值来连接其他文本值,并且可能jsonb_数组_元素中的json值应该在使用之前进行转换或转换为文本。这不重要,因为连接后,
json
将隐式转换为
text