簡體   English   中英

有沒有一種方法可以使用可以將多個列作為輸入的函數(例如`GREATEST`)而無需輸入每個列名?

[英]Is there a way to use functions that can take multiple columns as input (e.g. `GREATEST`) without typing out every column name?

我有一個包含 100 列的表,我想在其上使用GREATEST function。 如何防止將每個列名放入查詢中?

我想使用GREATEST的列有一個通用前綴,以防萬一這可能會有所幫助。

我現在就是這樣做的。

CREATE TEMP TABLE foo (id int, cc_a int, cc_b int, cc_c int);
INSERT INTO foo VALUES (3, '1', '2', '3'), (4, '15', '4', '100');

SELECT id, GREATEST(cc_a, cc_b, cc_c) FROM diff_table

您可以使用例如 JSON 函數將一行轉換為值列表:

SELECT id, 
       (select max(x.val::int)
       from jsonb_each(to_jsonb(f) - 'id') as x(col, val))
from foo f

在線示例

但我確實同意這聞起來像是一個糟糕的設計。

由於您想對每個id的大量值進行操作,因此是時候硬着頭皮創建表的 UNPIVOTed 視圖了。

缺點:你必須輸入一百個值
優點:你只需要在你的代碼庫中使用一次

我知道您正在研究 PostgreSQL,因此有一些解決方案,例如基於 hstore 的解決方案,根據回答者的說法,它可能適用於任意大量列。

如果您不能使用 hstore 擴展 - 它沒有安裝在 dbfiddle.com 上。 那么你可以依靠LATERAL JOIN ,靈感來自https://blog.sql-workbench.eu/post/unpivot-with-postgres/ 我在這個小提琴中測試了一個解決方案

暫無
暫無

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

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