【问题标题】:How to fetch data while where condition in jsonb in Postgresql如何在Postgresql中jsonb中的where条件下获取数据
【发布时间】:2020-08-26 06:46:53
【问题描述】:

我有一个这样的表 data_table

| id         | reciever                                     
| (bigint)   |(jsonb)                                      

----------------------------------------------------------------------
|    1       | [{"name":"ABC","email":"abc@gmail.com"},{"name":"ABDFC","email":"ab34c@gmail.com"},...]
|    2       | [{"name":"DEF","email":"deef@gmail.com"},{"name":"AFDBC","email":"a45bc@gmail.com"},...]
|    3       | [{"name":"GHI","email":"ghfi@gmail.com"},{"name":"AEEBC","email":"5gf@gmail.com"},...]
|    4       | [{"name":"LMN","email":"lfmn@gmail.com"},{"name":"EEABC","email":"gfg5@gmail.com"},...]
|    5       | [{"name":"PKL","email":"dfdf@gmail.com"},{"name":"ABREC","email":"a4rbc@gmail.com"},...]
|    6       | [{"name":"ANI","email":"fdffd@gmail.com"},{"name":"ABWC","email":"abrtc@gmail.com"},...]

当我在 pg admin 上运行时,它工作正常

I want to fetch row by putting email in where condition like select * from data_table where receiver = 'abc@gmail.com'. 数组中可以有更多数据,所以我显示了“...”。

我试过where receiver-->>'email'='abc@gmail.com',但它在{"name":"ABC","email":"abc@gmail.com"} only不在数组中的情况下工作,我必须检查数组中的每封电子邮件

我们将不胜感激。

【问题讨论】:

    标签: sql arrays json postgresql select


    【解决方案1】:

    一种选择是使用existsjsonb_array_elements()

    select t.*
    from mytable t
    where exists (
        select 1
        from jsonb_array_elements(t.receiver) x(elt)
        where x.elt ->> 'email' = 'abc@gmail.com'
    )
    

    这将为您提供数组中至少一个元素具有给定电子邮件的所有行。

    如果您想实际展示匹配的元素,则可以使用lateral join 代替(如果数组中的多个元素具有给定的电子邮件,这会重复该行):

    select t.*, x.elt
    from mytable t
    cross join lateral jsonb_array_elements(t.receiver) x(elt)
    where x.elt ->> email = 'abc@gmail.com'
    

    【讨论】:

    • 错误无法从对象@GMB 中提取元素
    • @bala 如果您收到该错误,那么您向我们展示的示例不准确。
    • 可能我遗漏了一件事,当数据为单个时,在某行中存储此 {"email":"abc@gmail.com"} 我的意思是它不在数组中@jjanes
    • @bala,简单的答案是“不要那样存储东西”。你可以解决它,但这将是一场永无止境的噩梦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多