簡體   English   中英

如何以不區分大小寫的方式從 Postgres jsonb 列中獲取記錄?

[英]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"]} |
+----+-----------------------------------------------------------------+

SQL 小提琴

您可以將 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.

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