данные JSON (со своими полями естественно, например "provider": "TTK", в другой записи например "provider":"ATT", они могут повторяться....).
Мне надо подсчитать, количество строк, в которых в JSON-е определенный провайдер..например "TTK".
Был предложен запрос вида -
SELECT COUNT(*) FROM ALLCHANNELS WHERE (tarriffs-»'provider')::jsonb ? 'TTK';
она работает, в PgAdmin даже без приведения типа
SELECT COUNT(*) FROM ALLCHANNELS WHERE (tarriffs-»'provider') ? 'TTK';
(выводит, количество строк совпадений), но не работает в интсрументе для тестирования API (SOAPUI если интересно), где я делаю запрос такой JDBC Request-ом.
Причем запрос SELECT COUNT(*) FROM ALLCHANNELS работает.
Вопрос: как можно заменить фильтр WHERE (tarriffs-»'provider') ? 'TTK'; ?
п.с. SOAPUI приложение написанное на Java, возможно ему пробелы не нравятся...
SELECT COUNT(*) FROM ALLCHANNELS WHERE (tarriffs-»'provider')::text = 'TTK';
советую упаковывать тексты запросов в блочные/строчные кодблоки, во избежание автоматических преобразований текста
почему то выдает вот такое(
И дажэ понятно, почему ругается: ? в JDBC -- это placeholder для параметра, его нужно экранировать чтобы он передался в текст запроса как ?.
Почитайте документацыю на JDBC -- там должно быть.
В операторах, которые используют символ ?, этот символ необходимо задваивать.
can you show me please?)
"select my_json ?? 'mykey' from ..."
api tool :(
А какая версия используемого jdbc-драйвера?
Суть такая: поддержка ?? появилась в драйвере версии 9.4 (очень давно). Либо у вас там реально древний драйвер (и он вряд ли работает с поддерживаемыми версиями postgresql), либо есть какой-то код, который до вызова prepareStatement заменяет ?? на ?
последняя - самая свежая
Ни "последняя" ни "самая свежая" -- это не версии.
В любом случае, у вас единственный путь - отловить запрос, который передаётся в prepareStatement. Далее уже разбираться, что не так. Кстати, проверьте, не встречается ли в тексте запроса $1 (это синтаксис для постановочных параметров для самого PostgreSQL). Могу лишь сказать, что и на 42.0.x/42.1.x, и на 42.2.10 (±2 минорные версии) у меня без проблем отрабатывали и запросы с параметрами (биндинг через ?), и запросы с операторами ?, ?& и т.п. (естественно, с удвоением символа ?).
а где? в какой системе? клиенте?
в java-приложении, которое, собственно, работает с БД через jdbc-драйвер, т.е., надо посмотреть, что за запрос передаётся в драйвер.
то есть прям в исходном коде? у меня то тул ( возможно он косячит вендору писать? readyapi
а у этой тулзы нет возможности настройки логирования? В любом случае, можно попытаться поиграться уровнем логгирования jdbc-драйвера (там прямо в строке подключения можно настроить), авось там запрос где-то выведится полностью. см. https://jdbc.postgresql.org/documentation/head/logging.html
thanks will see tomorrow :)
Обсуждают сегодня