2014-07-17 24 views
0

我希望能夠更新用戶註冊日期和修改日期,如果註冊日期值爲空分貝,否則只是更新修改日期。我目前的查詢如下:有沒有辦法爲子查詢設置別名,然後在if語句中使用別名?

WITH notregistered AS (select * 
    from user 
    where userid = '1' 
    AND registrationdate is null) 
if (select count from notregistered) < 1 then 
    UPDATE USER SET name = ?, MODIFIEDDATE = ? WHERE ID = ?; 
else 
    UPDATE MANAGEDUSER SET name = ?, MODIFIEDDATE = ?, REGISTRATIONDATE = ? WHERE ID = ?; 
END IF; 

但似乎無法滿足正確的sql語法。有沒有辦法在SQL中做到這一點,或者我應該把一些邏輯放在我的服務器代碼中?

+0

您不能使用SQL語句中的'IF'聲明。 'IF'只是PL/SQL,而不是SQL。 –

回答

0

您錯過了count的參數。嘗試count(<your_id_column_name>)以獲得計數。

+1

確實語法不正確,但這不是OP問題中的主要問題 –

0

正如@a_horse_with_no_name所述,您無法以該方式使用IF/THEN語句。這是通過PL/SQL實現的,在你的情況下可能是一個Procedure。 現在我想要說明這一點,因爲我並不擅長使用PL/SQL,但這是我想出來的,你可以給予一個機會。

它與您的示例非常相似,但我已填充'?'與我假設是你想要的。它應該是可讀的,但該過程被調用參數 ,它執行您在with語句中執行的檢查。根據該結果填充「總計」變量和IF/THEN更新的列數。

下面是您要運行它的過程和命令。有經驗的人:隨時提出改進建議,因爲這對我來說也是一個學習方面。

CREATE OR REPLACE 
PROCEDURE updateUser(
    param_name VARCHAR2, 
    param_modifiedDate DATE, 
    param_registrationDate DATE, 
    param_userId NUMBER) 
AS 
    total NUMBER; 
BEGIN 
    SELECT 
    COUNT(userid) 
    INTO 
    total 
    FROM 
    USER 
    WHERE 
    userid    = param_userId 
    AND registrationdate IS NULL; 
    IF total    = 0 THEN 
    UPDATE 
     USER 
    SET 
     name   = param_name, 
     modifieddate = param_modifiedDate 
    WHERE 
     userid = param_userId; 
    ELSE 
    UPDATE 
     manageduser 
    SET 
     name    = param_name, 
     modifieddate  = param_modifiedDate, 
     registrationdate = param_registrationDate 
    WHERE 
     userid = param_userId; 
    END IF; 
END; 

執行與:

EXECUTE updateuser('MyName', to_date('2014/07/17', 'yyyy/MM/dd'), to_date('2014/07/17', 'yyyy/MM/dd'), 1234) 
相關問題