在JSONB字段上查询使用like

时间:2016-08-17 18:29:46

标签: sql postgresql postgresql-9.5

我在PostgreSQL数据库中有一个字段,其格式为["tag1","tag2"]的JSONB类型,我正在尝试实现一个搜索,它将为预测下拉列表提供结果(即,如果用户输入“t”和上面的列存在两个标记都被返回。

有关如何执行此操作的任何建议吗?

我尝试了下面的查询,但它无效:

SELECT table.tags::JSONB from table where table.tags::TEXT like 't%';

1 个答案:

答案 0 :(得分:1)

你可以做的一种方法是使用 jsonb_array_elements_text()函数(https://www.postgresql.org/docs/current/static/functions-json.html

示例测试:

SELECT  T.tags
FROM    table T,
LATERAL jsonb_array_elements_text(T.tags) A
WHERE   A.value LIKE 't%';

由于jsonb_array_elements_text()创建了一组记录,并且在你的情况下除了LIKE之外没有其他条件,那么使用LATERAL(https://www.postgresql.org/docs/9.5/static/queries-table-expressions.html#QUERIES-LATERAL)可以帮助你这样做:

{'downloader/request_bytes': 38096,
 'downloader/request_count': 55,
 'downloader/request_method_count/GET': 55,
 'downloader/response_bytes': 5014634,
 'downloader/response_count': 55,
 'downloader/response_status_count/200': 55,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2016, 8, 17, 19, 12, 11, 607000),
 'item_scraped_count': 2,
 'log_count/DEBUG': 58,
 'log_count/INFO': 9,
 'log_count/WARNING': 1,
 'request_depth_max': 36,
 'response_received_count': 55,
 'scheduler/dequeued': 55,
 'scheduler/dequeued/memory': 55,
 'scheduler/enqueued': 55,
 'scheduler/enqueued/memory': 55,
 'start_time': datetime.datetime(2016, 8, 17, 19, 9, 13, 893000)}