簡體   English   中英

在postgresql中搜索JSON列的查詢

[英]Search query on JSON column in postgresql

我的表'類別'中有一個列'標簽',這是一個json類型

----------------------------------------------------------------
id    name                tags
----------------------------------------------------------------
1     Electronics         ["phones","computers","watches"]
2     Fashion             ["jewelry","costumes","watches"]
3     Food                ["cakes","sweets","juices"]
4     Tools               ["keyboards","pens","drills"]
----------------------------------------------------------------

我想獲取在我的SQL中匹配的數組中包含任何一個標記的所有類別

select * from categories where tags::jsonb ?| '{"watches","sweets"}'

我希望結果集為

------------------------------
1     Electronics 
2     Fashion
3     Food  
------------------------------

所以前兩個類別匹配“手表”,第三類匹配“糖果”

上面的查詢完全在我的本地服務器上工作,就像在9.4上那樣但是當我移動到現場itis 9.2.15並且沒有jsonb,返回錯誤時,json類型是否有類似的運算符返回查詢中的任何一個匹配元素?

categories.tags json或text數據類型? PostgreSQL 9.2中的JSON數據類型支持非常有限,因此盡管您可以在其中存儲JSON數據,但除了轉換為文本之外,您將無法以任何方式處理它。

您可以使用數組重疊&& ,而不是jsonb ?| 運營商:

with
  categories(id,name,tags) as (
    values (1, 'Electronics', '["phones","computers","watches"]'::json),
           (2, 'Fashion', '["jewelry","costumes","watches"]'),
           (3, 'Food', '["cakes","sweets","juices"]'),
           (4, 'Tools', '["keyboards","pens","drills"]'))

select *
from categories
where regexp_replace(regexp_replace(tags::text, '^\[', '{'), '\]$', '}')::text[] && '{watches,sweets}'::text[]

我剛剛找到了解決這個問題的簡單方法

我首先將json類型轉換為文本,然后用SIMILAR TO替換了我的搜索表達式

這是sql的示例

select * from categories where tags SIMILAR TO  ("watches"|"sweets")

“是必須的,因為它們有助於獲取匹配,就像你有像watches這樣的標簽, watches-new使用SIMILAR而不是”喜歡(watches|sweets)會產生兩者,如果你在文本上存儲的json上使用“”專欄,它可以按照您的意願工作。

希望這有助於像我這樣的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM