2014-11-25 27 views
1

用戶想邀請朋友,但我想先做一個檢查。例如:如何進行有條件檢查,返回錯誤或繼續?

SELECT friends_email from invites where friends_email = $1 limit 1; 

如果找到一個,然後我要回的消息,如「已經邀請了這位朋友。」

如果沒有找到一個,然後我希望做一個插入

INSERT INTO invites etc... 

但後來我需要返回主用戶的REGION_ID

SELECT region_id from users where user_id = $2 

什麼是做到這一點的最好方法是什麼?

謝謝。

EDIT ------------------------------------------- -------------------

經過幾個小時之後,我纔在'plpgsql'結束了。

IF EXISTS (SELECT * FROM invitations WHERE email = friends_email) THEN 
    return 'Already Invited'; 
END IF; 

INSERT INTO invitations (email) VALUES (friends_email); 

return 'Invited'; 

我不確定有可能有幾十種更好的方法,但這對我有用。

+0

您是否知道SQL中的CASE WHEN ... THEN ... ELSE ... END? – 2014-11-25 13:22:19

+0

@MladenUzelac如果插入if-not-exists會有什麼好處? – 2014-11-25 13:34:25

+0

看來你需要爲它編寫pl/pgsql函數或者在你的應用程序中解決它。 – 2014-11-25 14:15:01

回答

1

無需編寫確切的代碼片段你...

考慮解決這個問題的塑造你的數據以符合您的業務規則。如果您只能邀請一個人,那麼您應該有一個「邀請」表,通過任意列定義唯一邀請的UNIQUE規則來反映此情況。如果它只是一個電子郵件地址,則將「invites.email」聲明爲唯一列。

然後做一個INSERT。編寫插頁,以便利用Postgres' RETURNING clause爲成功提供答案。如果INSERT失敗(因爲您已經擁有該電子郵件地址 - 這是您希望執行的檢查的重點),那麼在應用程序代碼中捕獲失敗並返回相應的響應。

僞代碼:

應用:

try 
    invite.insert(NewGuy) 
catch error.UniqueFail 
    return "He's already been invited" 
# ...do other stuff 

Postgres的:

INSERT INTO invites 
    (data fields + SELECT region thingy) 
    VALUES 
    (some arrangement of data that includes "region_id") 
    RETURNING region_id 

如果這是很難發揮作用的第一次嘗試,措辭插入目標的CTE可能很有幫助。如果一切都失敗了,暫時將它寫在plpgsql中,確保外部接口接受一個正常的INSERT(所以你不必在以後更改應用程序代碼),並在知道性能是否爲問題。

這裏的基本思想是讓數據的關係形狀在任何可能的情況下都不需要任何程序檢查。這是關係數據建模的核心......現在有些失落的藝術。

+0

zxq9,感謝您的留言。當我通過不同的排列組合時,我一直回到它。我開始使用常規的SQL,然後以'plpgsql'結尾,最後以最簡單的方式添加到原始文章中。儘管我剛開始返回region_id,但最終發現我並不需要它。但整件事情都是一次很好的學習經歷。再次感謝。 – user390480 2014-11-27 01:26:56

+0

@ user390480好聽!我特別高興你在這個過程中學到了很多東西。這是迄今爲止最好的結果。 – zxq9 2014-11-27 01:29:12

-1

您可以創建SQL存儲過程來實現上述功能。

但是這是錯誤的形式體系結構的觀點。請參閱:Direct database manipulation an anti-pattern?

DB有責任範圍:存儲數據。

您必須將業務邏輯放入業務層。