Postgresql

Postgresql 按別名 jsonb 欄位分組

  • July 23, 2021

我正在嘗試按別名欄位上的 jsonb 操作的結果進行分組,但遇到了我沒想到的錯誤。

以下工作按預期進行:

select jsonb_build_object('x', 1) as a group by a;
select jsonb_build_object('x', 1) as a group by jsonb_build_object('x', 1)#>>'{x}';

   a     
----------
{"x": 1}

但這給了我一個錯誤:

select jsonb_build_object('x', 1) as a group by a#>>'{x}';
ERROR:  column "a" does not exist

這是 postgresql (13.3) 中的錯誤嗎?除了在 group by 中重複整個 select 表達式之外,還有什麼方法可以解決它?

SELECT僅當別名獨立且不在表達式中使用時,才可以使用別名(或引用列表中位置的數字)。

文件對此並不十分清楚;它說的是

如果有歧義,GROUP BY名稱將被解釋為輸入列名稱而不是輸出列名稱。

問題是您想使用 json 的值,但您可以在該位置訪問他的值,導致錯誤消息的原因

如果你需要這個,你需要頂部

SELECT a FROM (select jsonb_build_object('x', 1) as a) t1  group by a#>>'{x}';

作為在 Group by 中使用選擇列的另一個選項,不允許您選擇 json 的值,只能選擇列的完整內容

另見手冊

例子

引用自:https://dba.stackexchange.com/questions/296053