Open1

【postgres】ちょっと悩んだクエリ

r1wtnr1wtn

やりたかったこと

  • GROUP BYによる集約時
  • 集約されるある列について、NULLでない行が最大1行存在することがわかっている。
  • その行の値のみを取り出し、intとして取り出したい。

実行したクエリ

  • ポイント1
    • JSON_AGGで配列(型はjson)を生成
  • ポイント2
    • JSON_ARRAY_ELEMENTS を使い、その配列を擬似的なテーブルにみたて、NULLでない行のみを取り出す。
  • ポイント3
    • 抽出された行が'null'というjsonの場合intへのキャストに失敗する。
    • そのため、'null' が入っている場合には NULL型に変換し、それ以外の場合はintでキャストする。
SELECT
    table_a.col1,
    (
        SELECT NULLIF(value#>>'{}', 'null')::int
        FROM JSON_ARRAY_ELEMENTS(JSON_AGG(table_a.col3)) 
        WHERE value IS NOT NULL 
        LIMIT 1
    ) AS agg_col3
FROM some_table
GROUP BY table_a.col1