[英]How to fetch record from Postgres jsonb column with case insensitive manner?
我正在編寫一個 sql 查詢,以不區分大小寫的方式從 jsonb 列中獲取數據。 但我面臨一些問題。
數據庫數據:
select * from enterprise.contacts;
id data
--------------------------------
1 {"email": "abc@gmail.com", "interest": ["Cricket", "football"]}
2 {"email": "mno@gmail.com", "interest": ["Cricket"]}
3 {"email": "xyz@gmail.com", "interest": ["cricket", "Football"]}
我正在嘗試獲取對板球感興趣的數據。 (忽略大小寫)
下面的查詢我試過了,我只得到一條記錄,但它應該總共有 3 條記錄,因為板球出現在 3 行中。
我的查詢:
SELECT * from enterprise.contacts where ( (data->'interest' @> '"cricket"'));
Output:
id data
--------------------------------
3 {"email": "xyz@gmail.com", "interest": ["cricket", "Football"]}
預期 Output:
id data
--------------------------------
1 {"email": "abc@gmail.com", "interest": ["Cricket", "football"]}
2 {"email": "mno@gmail.com", "interest": ["Cricket"]}
3 {"email": "xyz@gmail.com", "interest": ["cricket", "Football"]}
對此的正確查詢應該是什么?
沒有具有citext
功能的 jsonb 之類的東西。
您可以在表達式lower((data->'interest')::text)::jsonb
上創建 GIN 索引,並在搜索中使用該精確表達式:
where lower((data->'interest')::text)::jsonb @> '"cricket"'
另一種方法是在插入字段之前將整個 jsonb 小寫,但這可能會產生不良后果。
由於區分大小寫比較,您不會獲得所有行。 您需要使用較低的 function 來比較所有小寫字符串,例如:
select *
from contacts
where (lower(data::text)::jsonb->'interest' @> '"cricket"');
結果:
+====+=================================================================+
| id | data |
+====+=================================================================+
| 1 | {"email": "abc@gmail.com", "interest": ["Cricket", "football"]} |
+----+-----------------------------------------------------------------+
| 2 | {"email": "mno@gmail.com", "interest": ["Cricket"]} |
+----+-----------------------------------------------------------------+
| 3 | {"email": "xyz@gmail.com", "interest": ["cricket", "Football"]} |
+----+-----------------------------------------------------------------+
您可以將 EXISTS 條件與取消嵌套元素一起使用:
select c.*
from contacts c
where exists (select *
from jsonb_array_elements_text(c.data -> 'interest') as i(interest)
where lower(i.interest) = 'cricket')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.