【问题标题】:How do I just select the "occupation"?如何选择“职业”?
【发布时间】:2015-08-22 04:44:34
【问题描述】:

我有以下几点:

SELECT * 
FROM (
   SELECT '{"people": [{"name": "Bob", "occupation": "janitor"}, {"name": "Susan", "occupation": "CEO"}]}'::jsonb as data
) as b 
WHERE data->'people' @> '[{"name":"Bob"}]'::jsonb;

我正在过滤对象 '{"name": "Bob", "occupation": "janitor"}'

如何返回 Bob 的职业(“看门人”)?

SELECT data->'people'->>'occupation'  
FROM (
   SELECT '{"people": [{"name": "Bob", "occupation": "janitor"}, {"name": "Susan", "occupation": "CEO"}]}'::jsonb as data
) as b 
WHERE data->'people' @> '[{"name":"Bob"}]'::jsonb;

返回

?column?
--------
NULL

正在寻找:

occupation
----------
janitor

【问题讨论】:

    标签: postgresql postgresql-9.4 jsonb


    【解决方案1】:

    如果你不关心jsonb所在行的任何其他内容,你可以将所有元素从jsonb中取出,然后将它们作为单独的元素进行选择

    SELECT data->>'occupation' as occupation
    FROM (
      SELECT jsonb_array_elements(
        '{"people": 
           [
             {"name": "Bob", "occupation": "janitor"}, 
             {"name": "Susan", "occupation": "CEO"}
           ]
         }'::jsonb->'people') as data) as b
    WHERE data @> '{"name":"Bob"}';
    

    结果

    职业
    ------------
    看门人
    (1 行)

    【讨论】:

    • 好答案,希望你不介意格式。您可以选择data->>'occuption' 以避免结果中出现双引号。
    • @Andomar 谢谢,错过了。编辑中
    • @SamiKuhmonen:这行得通,再次感谢! jsonb_array_elements 需要什么索引?我在这里找不到任何信息:postgresql.org/docs/9.4/static/datatype-json.html
    • 这真的很有帮助 1
    【解决方案2】:

    您的“人”元素是一个数组。您可以使用 jsonb_array_elements 函数获取数组的元素。之后,您可以过滤person->>'name'

    SELECT  person->>'occupation' as occupation
    FROM    (
            SELECT  person.value as person
            FROM    (
                    SELECT     
                      '{"people": 
                         [
                           {"name": "Bob", "occupation": "janitor"}, 
                           {"name": "Susan", "occupation": "CEO"}
                         ]
                       }'::jsonb as data
                    ) a
            CROSS JOIN
                    jsonb_array_elements(data->'people') as person
            ) b
    WHERE   person->>'name' = 'Bob';
    

    注意->> 返回文本,而-> 返回jsonb

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      • 2022-01-24
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      相关资源
      最近更新 更多