[英]Can count() be used in case statement?
我已將數據從 csv 文件復制到表stage_table
和列:
aid
a_name
addrid
addr1
addr2
city
pstate
country
postalcd
contactnumber
attendancekey
attendancedate
attendedyesno
action_indicator
當同一表中的aid
存在不止一次時,我試圖將表中的action_indicator
列設為“Y”(默認情況下,該列設置為“N”)。
我試過這個查詢但不起作用
update_address_query = ("update public.address set active_ind=case
when count(aid)>1 then 'Y' end from address")
cur.execute(update_address_query)
我收到錯誤如下:
psycopg2.errors.DuplicateAlias:多次指定表名“地址”
這可以通過其他方式糾正嗎?
此地址表中的列是
地址
地址1
地址2
城市
狀態
國家
郵政
聯系電話
active_indicator
示例輸出應如下所示:
99801,No-13 4rthcrossst,GandiNagar,Bangalore,Karnataka,India,456009,7800912345,N
99802,No-14 5thcrossst,NehruNagar,Hyderabad,Telangana,India,556001,6800612345,N
99803,No-15 6thcrossst,SardarNagar,Ahmedabad,Gujarat,India,356009,9800912345,N
99804,No-16 7thcrossst,PatelNagar,Bangalore,Karnataka,India,456009,5800912345,N
99805,No-17 8thcrossst,AnnaNagar,Chennai,TamilNadu,India,456009,4800912345,N
99801,No-13 4rthcrossst,GandiNagar,Bangalore,Karnataka,India,456009,7800912345,Y
99802,No-14 5thcrossst,NehruNagar,Hyderabad,Telangana,India,556001,6800612345,Y
99803,No-15 6thcrossst,SardarNagar,Ahmedabad,Gujarat,India,356009,9800912345,Y
99804,No-16 7thcrossst,PatelNagar,Bangalore,Karnataka,India,456009,5800912345,Y
99805,No-17 8thcrossst,AnnaNagar,Chennai,TamilNadu,India,456009,4800912345,Y
99801,No-13 4rthcrossst,GandiNagar,Bangalore,Karnataka,India,456009,7800912345,Y
99802,No-14 5thcrossst,NehruNagar,Hyderabad,Telangana,India,556001,6800612345,Y
99803,No-15 6thcrossst,SardarNagar,Ahmedabad,Gujarat,India,356009,9800912345,Y
99804,No-16 7thcrossst,PatelNagar,Bangalore,Karnataka,India,456009,5800912345,Y
99805,No-17 8thcrossst,AnnaNagar,Chennai,TamilNadu,India,456009,4800912345,Y
如果我做對了,當且僅當表中同一行中的aid
存在多次時,您才希望將active_ind
設置為“Y”。 您可以使用相關子查詢來獲取count()
。
UPDATE public.address a1
SET active_ind = CASE
WHEN (SELECT count(*)
FROM public.address a2
WHERE a2.aid = a1.aid) > 1 THEN
'Y'
END;
順便說一句:這是一個CASE
表達式,而不是一個語句。
編輯:
如果您不想觸及其他行的active_ind
,您還可以在WHERE
子句中添加這樣的子查詢。
UPDATE public.address a1
SET active_ind = 'Y'
WHERE (SELECT count(*)
FROM public.address a2
WHERE a2.aid = a1.aid) > 1;
您的問題與您想要的輸出不符。 您的所有記錄都已更新,因為您的所有記錄都有關於aid
重復項。 所以這種情況貌似是數據庫的設計問題。 如果您的 Postgres 版本小於 12(當前),您可以嘗試使用OIDS
列來查找最舊的行並將它們標記為 'N' 作為active_indicator
。 其余的將標有“Y”。 代碼看起來像這樣:
UPDATE test_so SET active_indicator = 'Y';
UPDATE test_so SET active_indicator = 'N'
FROM (SELECT *, oid, row_number() over (partition by addrid order by oid) AS rank
FROM test_so) a
WHERE a.rank = 1
AND test_so.oid = a.oid;
但是為此目的使用時間戳要好得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.