Сложность здесь в том, что, хотя вы можете подумать, что столбцы 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.