Книжная полка: построитель запросов: как использовать оператор like со столбцом json? - PullRequest
0 голосов
/ 14 января 2020

Я использую книжную полку с postgresql база данных

Информация представляет собой столбец типа json.

Я хочу получить все столбцы, похожие на '% pattern%' С sql запрос, который я использую

select * from table where information::text like '%pattern%';

Я хочу сделать это с помощью построителя запросов на книжной полке

model.query(function(qb) {
  qb.where('information', 'LIKE', '%pattern%')
}).fetch()

Но это не сработало, и я не могу найти, как это сделать в документы на книжной полке

Есть идеи?

1 Ответ

1 голос
/ 14 января 2020

Сложность здесь в том, что, хотя вы можете подумать, что столбцы JSON (и JSONB) являются текстовыми, это не так! Так что нет никакого способа сделать LIKE сравнение на одном. Ну, есть, но вам нужно сначала преобразовать его в строку:

SELECT * FROM wombats WHERE information #>> '{}' LIKE '%pattern%';

, что действительно ужасная идея, пожалуйста, не делайте этого! Как указывает @ GMB в комментариях, JSON - это гораздо более мощный структурированный формат. Postgres отлично справляется с работой JSON, поэтому просто спросите его, что вам нужно. Допустим, ваше значение находится в JSON свойстве с именем description:

SELECT * FROM wombats
  WHERE (information->'description')::TEXT
  LIKE '%pattern%';

Здесь, даже если мы определили правильное свойство в нашем JSON объекте, оно выглядит как тип JSON: нам все еще нужно привести его к ::TEXT перед тем, как сравнить его со строкой, используя LIKE. Версия Bookshelf / Knex всего этого будет выглядеть так:

model
  .query(function(qb) {
    const keyword = "pattern";
    qb.whereRaw(`(information->'description')::TEXT LIKE '%${keyword}%'`)
  })
  .fetch();

Очевидно, что эта часть необработанного запроса не может быть параметризована (по крайней мере, в Postgres), поэтому требуется замена строки в JavaScript , Это означает, что вы должны быть очень осторожны с тем, откуда взялась эта строка (ie использовать только ограниченное подмножество или выполнить санитарную обработку перед использованием), поскольку вы обходите обычные средства защиты Knex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...