Использование PostgreSQL & ldquo;? & Rdquo; оператор в Eloquent [дубликат]

Для более сложного разбора JSON я предлагаю использовать python jsonpath module (by Stefan Goessner) -

  1. Установить его -

sudo easy_install -U jsonpath

  1. Использовать его -

Пример file.json (из http://goessner.net/articles/JsonPath ) -

{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

Разберите его (извлеките все названия книг с ценой & lt; 10) -

$ cat file.json | python -c "import sys, json, jsonpath; print '\n'.join(jsonpath.jsonpath(json.load(sys.stdin), 'store.book[?(@.price < 10)].title'))"

Выведет -

Sayings of the Century
Moby Dick

ПРИМЕЧАНИЕ. командная строка не включает проверку ошибок. для полного решения с проверкой ошибок вы должны создать небольшой скрипт python и обернуть код с помощью try-except.

18
задан mikl 1 May 2013 в 03:33
поделиться

3 ответа

Используйте форму вызова функции. Согласно системным каталогам, оператор hstore ? использует функцию exist:

regress=# select oprname, oprcode from pg_operator where oprname = '?';
 oprname | oprcode 
---------+---------
 ?       | exist
(1 row)

, чтобы вы могли написать:

SELECT * FROM tbl WHERE exist(hst,'foo');

(Лично я не большой поклонник конструкторской документации и документации hstore, я думаю, что он отбрасывает полезные самодокументирующие свойства функционально-ориентированного интерфейса без какой-либо реальной выгоды, и я обычно использую его вызовы функций, а не его операторы. Просто потому, что вы можете определить операторы 't означает, что вы должны.)

27
ответ дан Craig Ringer 19 August 2018 в 10:51
поделиться
  • 1
    я использую это на данный момент, но, к сожалению, нет функции замены для & amp; и? | операторы. Думаю, я могу написать свой собственный ... отстой. – David Chan 4 June 2014 в 16:52
  • 2
    А? Должна быть функция, поддерживающая любой оператор. Разумеется, включение их в выше, ?& - exists_all, а ?| - exists_any. – Craig Ringer 4 June 2014 в 16:56
  • 3
    При подстановке оператора ? для использования с типами данных JSONB замените EXIST() на JSONB_EXISTS(). – Joshua Burns 1 July 2016 в 02:34

У меня была такая же проблема при поиске по данным JSONB. Полный вопрос: здесь

SELECT * FROM post WHERE locations ? :location;

Обходной путь на PostgreSQL 9.5 аналогичен:

SELECT * FROM post WHERE jsonb_exists(locations, :location);

Я также открыл билет / g1] в системе отслеживания ошибок PHP

Update

Как упоминалось в Diabl0, предлагаемое решение работает, но не использует индекс. Протестировано с помощью:

CREATE INDEX tempidxgin ON post USING GIN (locations);
8
ответ дан michaelbn 19 August 2018 в 10:51
поделиться
  • 1
    Пожалуйста, не публикуйте свой ответ на все вопросы такого рода. вместо этого отметьте их как дубликат. – Your Common Sense 23 March 2016 в 12:38
  • 2
    @YourCommonSense Я упомянул, что обходное решение (решение) отличается и стоит подчеркнуть. Я понятия не имею, что вы имеете в виду. Он сфокусирован и определен в соответствующих местах. – michaelbn 23 March 2016 в 15:35
  • 3
    Выше решение также работает в PostgreSQL 9.4 – Joshua Burns 1 July 2016 в 02:32
  • 4
    Это решение, поскольку оно работает, имеет один огромный недостаток - запросы с использованием jsonb-функций не используют индексы, которые могут привести к значительному снижению производительности. – Diabl0 26 June 2017 в 08:58

Я предлагаю вам отключить собственный подготовленный оператор PDO, поэтому вопросительные знаки будут игнорироваться:

$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);
-3
ответ дан thiago marini 19 August 2018 в 10:51
поделиться
  • 1
    Каким бы способом вы не установили этот параметр, PDO выполняет некоторые синтаксические разбора и неверно интерпретирует ?. – IMSoP 23 March 2016 в 12:51
  • 2
    Этот ответ работает на меня, хотя он не был на той версии PHP, которую я использовал раньше. Пытался сменить нисходящий ход, не позволю мне, если вы не пересмотрите;) – Joshua Burns 16 February 2018 в 00:39
Другие вопросы по тегам:

Похожие вопросы: