Nano Hash - криптовалюты, майнинг, программирование

Оператор Postgres jsonb «НЕ содержит»

Я экспериментирую с типами столбцов postgres jsonb, и пока все хорошо. Один общий запрос, который я использую, выглядит следующим образом:

select count(*) from jsonbtest WHERE attributes @> '{"City":"Mesa"}';

Как мне это изменить? Есть ли другой оператор или он просто используется как

select count(*) from jsonbtest WHERE NOT attributes @> '{"City":"Mesa"}';

  • Нет, для этого нет специального оператора. Что не так с NOT? 28.09.2016
  • @redneb Проблема в том, что NOT просто не работает. Использование формулы attributes->>'City' <> 'Mesa' также не работает. 30.03.2017
  • @eykanal NOT работает очень хорошо. 28.04.2017

Ответы:


1

Двумя способами вы можете проверить любое значение json (b)

  • оператор ->> извлекает значение как текст. Но эта операция медленная, если вы будете использовать только значение test
  • оператор @> проверяет, что любой json(b) содержит любой json(b). Это быстрый, но НЕ проверенный вариант.

Простой и быстрый способ:

NOT (attribute @> '{"City":"Mesa"}'::jsonb)

Я изменил attribute->>'City' <> 'Mesa' на NOT (attribute @> '{"City":"Mesa"}'::jsonb), и время выполнения запроса ~ 2 000 000 строк изменилось с 45 до 25 секунд.

05.01.2019
  • Разочаровывает то, что если вы добавили хороший индекс USING GIN(attribute), отрицание оператора @› contains внезапно перестанет использовать этот индекс. 06.02.2020
  • NOT не охватывает ситуацию, когда у вас есть атрибут, но этот атрибут равен NULL 01.03.2021

  • 2

    Этого можно добиться при соблюдении нескольких условий. Это не элегантно, но я не нашел другого способа сделать это.

    Итак, сначала получите каждую строку, в которой просто нет атрибута «Город», а затем добавьте условие «ИЛИ», чтобы проверить правильность значения поля.

    select count(*) from jsonbtest where 
      NOT(attributes ? 'City') 
      OR (attributes ? 'City') is NULL -- this is required if attributes can be null
      OR (attributes->>'City' != 'Mesa')) 
    
    26.04.2017
  • Это мне очень помогло... Я ничего не нашел об этом варианте использования на сайте PgSQL. Спасибо! 27.02.2021

  • 3

    Вы можете использовать оператор <@, это будет искать, где «Город» не «Меса».

    select count(*) from jsonbtest WHERE attributes <@ '{"City":"Mesa"}';
    
    12.01.2018
  • Это было бы то же самое, что и select count(*) from jsonbtest WHERE '{"City":"Mesa"}' @> attributes;, проверяя, содержит ли {"City": "Mesa"} attributes, что не одно и то же. 18.12.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..