我想检查是否一些文本包含文本和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
铸造一些想法,但至今没有运气。
的问题是,||
和->>
操作符具有相同precedence和是左关联,所以表达式被解释为
(('%item/' || ids) ->>'id') || '%'
你必须添加括号:
'%item/' || (ids->>'id') || '%'
最后得到了这个工作,这是结果:
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'