我在 Postgres 11 中有下表。
col1 col2 source col3
a abc curation rejected
a abc DB
b etg DB accepted
c jfh curation
如何根據 col1 中的值在 col3 中分配值
預期的輸出是:
col1 col2 source col3
a abc curation rejected
a abc DB rejected
b etg DB accepted
c jfh curation null
有沒有辦法檢查后續行中 col1 和 col2 中的值是否相同,然后將相同的 col3 分配給所有行(如果另一行中的 col3 值為空)。
非常感謝任何幫助。
uj5u.com熱心網友回復:
您并不完全清楚標準是什么,但在基本層面上,它可能取決于您希望如何查詢這些資料,您可以通過多種方式來做到這一點。
生成的列
drop table if exists atable ;
CREATE TABLE atable (
cola text ,
colb text GENERATED ALWAYS AS (case when cola='a' then 'rejected' else
null end) STORED
);
insert into atable(cola) values ('a')
一個看法。
create or replace view aview as
select cola, case when cola='a' then 'rejected' else null end as colb
from atable;
兩者都會產生相同的結果。
cola|colb |
---- --------
a |rejected|
其他選項可能是物化視圖、簡單的查詢邏輯。
你有選擇。
uj5u.com熱心網友回復:
update a2 set
col3 =
case when col1 = 'a' then 'rejected'
when col1 = 'b' then 'accepted'
when col1 = 'c' then 'null' end
where col3 is null
returning *;
您還可以設定觸發器。但是僅生成的列僅可從12起使用。因此,您需要升級以使用生成的列。
DB小提琴
uj5u.com熱心網友回復:
您可以嘗試使用MAX視窗功能。
SELECT col1,col2,MAX(col3) OVER(PARTITION BY col1,col2) col3
FROM T
如果你想要UPDATE的值,你可以嘗試UPDATE用一個子查詢
UPDATE T t1 SET col3 = c.new_col3 FROM ( SELECT col1,col2,MAX(col3) OVER(PARTITION BY col1,col2) new_col3 FROM T ) c WHERE t1.col1 = c.col1 AND t1.col2 = c.col2;
SELECT * FROM T;col1 | col2 | COL3 :--- | :--- | :------- 一個 | 美國廣播公司 | 被拒絕 一個 | 美國廣播公司 | 被拒絕 乙 | ETG | 公認 c | JFH | 空值
db <>小提琴在這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/447401.html
標籤:PostgreSQL
上一篇:如何使用JPQL獲得今天的物品
