2016-11-25 41 views
0

我想要做到以下,但我得到一個DELETE FROM錯誤,任何想法爲什麼?所以,我怎麼能檢查是否在person_net_contacts的createts = endts是一定persondID然後刪除...其他更新真的......案例,選擇和更新在一個單一的查詢

SELECT 
    createts, endts, 
    CASE WHEN createts = endts 
     THEN DELETE FROM person_net_contacts where personid='276178'; 
     ELSE UPDATE person_net_contacts SET endts = current_timestamp 
WHERE personid='276178'; 
FROM person_net_contacts 
+0

PERSONID = '276178' 存在嗎? –

+0

yes of course. – Lara

+1

按照常識,刪除值時選擇不合邏輯,也許這就是爲什麼SQL沒有提供這樣的功能。所以,*這是不可能的*。 – Vikrant

回答

0
IF EXISTS(SELECT 1 FROM person_net_contacts WHERE personid='276178' AND DATEDIFF(DAY,createts,endts) = 0) 
BEGIN 
    DELETE FROM person_net_contacts where personid='276178' 
END 
ELSE 
BEGIN 
    UPDATE person_net_contacts SET endts = current_timestamp where personid='276178' 
END 
+1

請格式化你的代碼! – HoneyBadger

+1

這對Postgres無效 –

+0

我把所有的答案都格式化了,但是我沒有得到正確的代碼格式。我該怎麼做......?你能建議我 – Mansoor

0

不能混合SELECTDELETEUPDATECASE像這個。我假設你想這樣做:

DELETE FROM person_net_contacts 
WHERE personid='276178' AND createts=endts; 

UPDATE person_net_contacts 
SET endts = current_timestamp 
WHERE personid='276178' AND createts!=endts; 
-- the last condition only kicks in if you run the two statements in a different order 
+0

Vikrant的回答同樣有效。這取決於你更喜歡使用SQL還是plpgsql。 – chris

+0

是的,它的工作原理是這樣的,但爲什麼我們不能混合它們;( – Lara

+0

,因爲生活是不公平的,...因爲那些提出SQL語法的人不想進入解析器地獄) – chris

0

操作(SELECT和DELETE,UPDATE)的這樣的搭配不是SQL表達式的一部分。但是,您可以使用正確的條件獨立運行SELECT,DELETE和UPDATE操作:

所有選擇字段必須是返回某個值的表達式:UPDATE或DELETE操作不適用於此目的。

SELECT createts, endts 
FROM person_net_contacts 
WHERE personid='276178'; 

刪除記錄時createts = endts

DELETE FROM person_net_contacts where personid='276178' and createts = endts; 

更新記錄時createts <> endts(最後一個條件可以中省略,更新隻影響未在刪除記錄前面的命令)

UPDATE person_net_contacts SET endts = current_timestamp where personid='276178' and createts <> endts; 
3

你可以這樣做無線

with to_check as (
    SELECT personid, createts, endts, createts = endts as delete_this 
    WHERE personid = '276178' 
    FROM person_net_contacts 
), deleted as (
    delete from person_net_contacts 
    where personid = (select personid 
        from to_check 
        where delete_this) 
) 
update person_net_contacts pnc 
    SET endts = current_timestamp 
from to_check tc 
    where tc.personid = pnc.personid 
    and not tc.delete_this; 

第一CTE從表中選擇行並創建一個標誌,它告訴我們,如果該行應被刪除或不:如果您使用可寫的CTE日單個查詢。然後第二個CTE根據該標誌刪除行,如果需要,最後的語句會更新該行。

這也適用於多行,假設personid是唯一的。

您還應該將數字與數字進行比較'276178'是一個字符串值,而不是數字。如果personid被定義爲數字數據類型(integerbigint或類似的東西),則應使用where personid = 276178。切勿在數字周圍放置單引號。

3

您可以刪除或使用with聲明一個查詢更新行,例如:

with delete_person as (
    delete from person_net_contacts 
    where personid = '276178' 
    and createts = endts 
    returning 'deleted'::text, createts, endts 
), 
update_person as (
    update person_net_contacts 
    set endts = current_timestamp 
    where personid = '276178' 
    and createts is distinct from endts 
    returning 'updated'::text, createts, endts 
) 
select * 
from delete_person 
union all 
select * 
from update_person;