【问题标题】:PostgreSQL multilevel search in JSONJSON 中的 PostgreSQL 多级搜索
【发布时间】:2018-05-11 08:57:08
【问题描述】:

问题是如何在 PostgreSQL 的多级 JSON 列中搜索(使用LIKE 语句)。

我想通过name 进行搜索,它位于en 或任何其他列支持的语言中。

表:

places
-------

id                     ascii_name                    translations

dsrsfdsf               be-namor		    { "en":{"locale":"en","name":"Namur"},"de":{"locale":"de","name":"Namur"},"bg":{"locale":"bg","name":"Намюр"} }
s3drs2es	       be-mouscron          { "en":{"locale":"en","name":"Mouscron"},"pl":{"locale":"pl","name":"Mouscron"},"de":{"locale":"de","name":"Mouscron"} }

我刚刚找到了一种使用json_object_keys的方法,但是它会导致我无法在WHERE语句中使用set-returning函数的错误。

SELECT * FROM places p WHERE p.translations->json_object_keys(p.translations)->'name' LIKE '%Namur%'

错误:

[0A000] 错误:WHERE 中不允许设置返回函数

提前谢谢你!

【问题讨论】:

    标签: json postgresql multi-level


    【解决方案1】:
    so=# with c(j) as (values
     ('{ "en":{"locale":"en","name":"Namur"},"de":{"locale":"de","name":"Namur"},"bg":{"locale":"bg","name":"Намюр"} }'::json)
    ,('{ "en":{"locale":"en","name":"Mouscron"},"pl":{"locale":"pl","name":"Mouscron"},"de":{"locale":"de","name":"Mouscron"} }')
    )
    , filter as (select j,j->json_object_keys(j)->>'name' like '%amur%' as "found" from c)
    select distinct j::jsonb from filter where found;
                                                                  j
    -----------------------------------------------------------------------------------------------------------------------------
     {"bg": {"name": "Намюр", "locale": "bg"}, "de": {"name": "Namur", "locale": "de"}, "en": {"name": "Namur", "locale": "en"}}
    (1 row)
    

    请注意,我将 json 转换为 jsonb 以过滤掉骗子

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 2016-08-05
      • 1970-01-01
      • 2017-08-31
      • 2018-01-21
      • 2017-05-17
      • 2021-09-27
      • 1970-01-01
      相关资源
      最近更新 更多