Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在Postgres中过滤JSON数组_Arrays_Json_Postgresql_Postgresql 9.5 - Fatal编程技术网

Arrays 如何在Postgres中过滤JSON数组

Arrays 如何在Postgres中过滤JSON数组,arrays,json,postgresql,postgresql-9.5,Arrays,Json,Postgresql,Postgresql 9.5,我目前有这个左连接,这是一个更大的选择的一部分 LEFT JOIN ( SELECT tags_components.component_id, array_to_json(array_agg(tags.*)) as tags FROM tags_components LEFT JOIN tags ON tags.id = tags_components.tag_id AND tags_components.component_name = 'contact'

我目前有这个左连接,这是一个更大的选择的一部分

LEFT JOIN (
  SELECT
    tags_components.component_id,
    array_to_json(array_agg(tags.*)) as tags
    FROM tags_components
    LEFT JOIN tags ON tags.id = tags_components.tag_id AND tags_components.component_name = 'contact'
    GROUP BY tags_components.component_id
) AS tags ON tags.component_id = contact.id

如果组件已分配所有标记,则该选项将按预期工作。但是,标记数组的大小始终为COUNTtags.*因此,对于没有任何标记的组件,使用null填充。有没有办法过滤掉这些空值?我尝试了不同的方法,例如使用json_strip_nulls或在数组上设置过滤器,但我没有获得正确的结果json数组只包含非空值

如果我正确理解了所有内容,那么您面临的问题是:

...
array_to_json(array_agg(tags.*)) as tags
...
可能您以错误的方式使用了筛选器,但这确实会产生空结果,如:

SELECT  array_to_json(
            -- FILTER is applied to this specific 'array_agg'
            array_agg( t.* ) FILTER ( WHERE t.tag IS NOT NULL )
        )
FROM    ( VALUES
            ( 'a1' ),
            ( 'b1' ),
            ( null ),
            ( 'c1' ),
            ( null ),
            ( 'd1' )
        ) t( tag );

-- Resolves to:
                     array_to_json
-------------------------------------------------------
 [{"tag":"a1"},{"tag":"b1"},{"tag":"c1"},{"tag":"d1"}]
(1 row)
或者,您可以使用jsonb_agg read more at而不是array_to_json+array_agg来提供相同的结果,如:

SELECT  jsonb_agg( t.* ) FILTER ( WHERE t.tag IS NOT NULL )
FROM    ( VALUES
            ( 'a1' ),
            ( 'b1' ),
            ( null ),
            ( 'c1' ),
            ( null ),
            ( 'd1' )
        ) t( tag );

如果我对每件事都理解正确,那么你面临的问题是:

...
array_to_json(array_agg(tags.*)) as tags
...
可能您以错误的方式使用了筛选器,但这确实会产生空结果,如:

SELECT  array_to_json(
            -- FILTER is applied to this specific 'array_agg'
            array_agg( t.* ) FILTER ( WHERE t.tag IS NOT NULL )
        )
FROM    ( VALUES
            ( 'a1' ),
            ( 'b1' ),
            ( null ),
            ( 'c1' ),
            ( null ),
            ( 'd1' )
        ) t( tag );

-- Resolves to:
                     array_to_json
-------------------------------------------------------
 [{"tag":"a1"},{"tag":"b1"},{"tag":"c1"},{"tag":"d1"}]
(1 row)
或者,您可以使用jsonb_agg read more at而不是array_to_json+array_agg来提供相同的结果,如:

SELECT  jsonb_agg( t.* ) FILTER ( WHERE t.tag IS NOT NULL )
FROM    ( VALUES
            ( 'a1' ),
            ( 'b1' ),
            ( null ),
            ( 'c1' ),
            ( null ),
            ( 'd1' )
        ) t( tag );

array_remove函数现在将是您的最佳选择:
array_to_jsonarray_removearray_aggtags.*,null as tags

array_remove函数现在将是您的最佳选择:
array_to_jsonarray_removearray_aggtags.*,空为标记

谢谢,过滤器真的工作了。我敢打赌我写的代码完全一样,但显然不是:谢谢你,过滤器真的工作了。我敢打赌我写的代码完全相同,但显然不是: