簡體   English   中英

向 mysql json_arrayagg 函數添加條件

[英]add condition to mysql json_arrayagg function

我有一個 json 查詢,它給我一個人和寵物的連接表的 json:

SELECT json_object(
  'personId', p.id,
  'pets', json_arrayagg(json_object(
    'petId', pt.id,
    'petName', pt.name
  ))
  )
FROM person p LEFT JOIN pets pt
ON p.id = pt.person_id
GROUP BY p.id;

我的問題是那個人可以有 0 只或更多寵物,當一個人有 0 只寵物時,我會得到 1 只空寵物的列表,在這種情況下我想得到的是空列表。

這就是我得到的:

{
  "personId": 1,
  "pets": [
    {
      "petId": null,
      "petName": ""
    }
  ]
}

我需要:

{
  "personId": 1,
  "pets": []
}

那可能嗎?

問題是LEFT JOIN仍然從您要加入的表中返回列,它只是將它們的值設置為NULL

您可以使用IF來測試COUNT(pt.id) ,因為這不會計算空值。

SELECT json_object(
  'personId', p.id,
  'pets', IF(COUNT(pt.id) = 0, JSON_ARRAY(),
             json_arrayagg(json_object(
                'petId', pt.id,
                'petName', pt.name
                )
            ))
  )
FROM person p LEFT JOIN pets pt
ON p.id = pt.person_id
GROUP BY p.id;

另一種可能性是將聚合放在相關子查詢中,如果不存在行,則使用coalesce()將其替換為空數組。

SELECT json_object('personID', p.id,
                   'pets', coalesce((SELECT json_arrayagg(json_object('petId', t.id,
                                                                      'petName', t.name))
                                            FROM pets t
                                            WHERE t.person_id = p.id),
                                    json_array()))
       FROM person p;

添加另一個選項:

select IFNULL( /*expression of select ...JSON_ARRAYAGG(
                                    JSON_OBJECT(....*/,JSON_ARRAY()) jarrayaggAlias

下面的清潔劑:

IFNULL( expression, ,JSON_ARRAY()) jarrayaggAlias

結果:

/* { jarrayaggAlias: []  }*/

如果您將alt_value 換成IFNULL以選擇[] ,那么您的所有結果都將被字符串化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM