Postgres неверный синтаксис ввода для типа json Подробно: токен "%" недействителен - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь проверить, содержит ли какой-либо текст конкатенацию текста и значение из массива в 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 но пока не повезло.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Проблема в том, что операторы || и ->> имеют одинаковый приоритет и являются ассоциативными слева, поэтому выражение интерпретируется как

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

.добавить скобки:

'%item/' || (ids->>'id') || '%'
0 голосов
/ 12 февраля 2019

Наконец-то все заработало, вот результат:

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'

...