postgresql SQL如何在所有值都为null时返回空数组?

gijlo24d  于 11个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(161)

我用json_agg和json_build选择了一些表,所有的工作,但我得到了一些数据,我不想要它,
我的product_media(pm)是空的,没有图像,如果我使用json_agg(json_build_object)),那么我得到了所有行的3x次null,如下所示:

product_media: [
    {
      id: null,
      src: null,
      alt: null,
      s_position: null,
      updated_at: null
    },
    {
      id: null,
      src: null,
      alt: null,
      s_position: null,
      updated_at: null
    },
    {
      id: null,
      src: null,
      alt: null,
      s_position: null,
      updated_at: null
    }
  ],

字符串
我怎么能说当id是空的,然后不显示它,或者当没有产品媒体被发现,然后使一个空数组?
验证码:

SELECT 

      p.id,
      p.shop_id,
      p.provider_id,
      p.name,
      p.status,

      json_agg(json_build_object(
        'id', pt.id,
        'tag', pt.tag
      )) AS tags,

      json_agg(json_build_object(
        'id', pm.id,
        'src', pm.src,
        'alt', pm.alt,
        's_position', pm.s_position,
        'updated_at', pm.updated_at
      )) AS product_media

      po.id as po_id,
      po.name,
      po.position,

      pov.id as pov_id,
      pov.value,

      pv.id as pv_id,
      pv.quantity,
      pv.price,
      pv.is_male,
      pv.shipping_price,
      pv.grams,
      pv.weight,
      pv.weight_unit,
      pv.length,
      pv.s_position,
      pv.option_1,
      pv.option_2,
      pv.option_3

      FROM product p

      LEFT JOIN product_media pm
      ON pm.p_id = p.id

      LEFT JOIN product_options po
      ON po.p_id = p.id

      LEFT JOIN product_options_value pov
      ON pov.p_o_id = po.id

      LEFT JOIN product_tags pt
      ON pt.p_id = p.id

      LEFT JOIN product_variants pv
      ON pv.p_id = p.id

      WHERE p.provider_id = $1
      
      GROUP BY 
        p.id,
        pm.id,
        po.id,
        pov.id,
        pv.id
        
      LIMIT 1;


我非常感谢你的帮助,我不知道该做什么或如何做

l7mqbcuq

l7mqbcuq1#

尝试使用json_strip_nulls()

json_agg(json_strip_nulls(json_build_object(
        'id', pm.id,
        'src', pm.src,
        'alt', pm.alt,
        's_position', pm.s_position,
        'updated_at', pm.updated_at
      ))) AS product_media

字符串
如果您可以使用jsonb而不是json,则首选(more space efficient)。如果您选择使用jsonb,则可以使用jsonb_strip_nulls()

42fyovps

42fyovps2#

这个应该可以

json_agg(
    CASE WHEN pm.id IS NULL THEN NULL ELSE
      json_build_object(
        'id', pm.id, 
        'src', pm.src,
        ...
      ) END
  ) AS product_media

字符串
这将检查pm.id是否是NULL,如果是,则返回NULL,而不是构建JSON对象。
所以当有NULL值时,你希望得到一个空数组。你可以用这个更新你的查询
使用COALESCENULL转换为空数组

COALESCE(
    json_agg(
      CASE WHEN pm.id IS NULL THEN NULL ELSE
        json_build_object(
          'id', pm.id,
          'src', pm.src, 
          'alt', pm.alt
        )
      END
    ),
    '[]'
  ) AS product_media

相关问题