[英]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.