2012-10-27 64 views
1

ELSE條件我有一個SQL查詢其中我必須從一個不同的表中提取一個附加PARAM,僅當一值存在於主表。我曾嘗試使用if else子句,但它從不起作用。IF在SQL查詢

的SQL是這樣的:

SELECT 
    hist.I_PAYT_REF AS PAY_REF, 
    hist.C_USERID AS USER_ID, 
    IF(@hist.I_PAYT_REF IS NULL) 
    BEGIN 
     SELECT 
     PAYT.I_PAYT_REQ_SUM AS PAYMENT_FILE_ID 
     Join 
     SP.TSP_CP_PAYT_RQ_DTL PAYT ON PAYT.I_PAYT_REF = hist.I_PAYT_REF 
    END 
FROM 
    sp.TSP_CP_HIST hist 
WHERE 
    hist.C_HIST_TYPE ='V' 

所有我想要做的就是獲取一個新的參數,如果hist.I_PAYT_REF不爲空。任何幫助將不勝感激。

感謝, Yeshwanth

+0

*** SQL ***只是*結構化查詢語言* - 許多數據庫系統使用的語言,但不是數據庫產品......很多東西都是特定於供應商的 - 所以我們真的需要知道什麼**數據庫系統**(和哪個版本)你使用.... –

+0

@ marc_s:我很抱歉沒有提供完整的細節。我會盡早得到詳細信息並更新信息。 –

回答

2

你只需要一個左連接,如果I_PAYT_REF是空的加盟將不排除主要hist記錄和PAYMENT_FILE_ID無論如何都會被返回null。

SELECT 
    hist.I_PAYT_REF AS PAY_REF, 
    hist.C_USERID AS USER_ID, 
    PAYT.I_PAYT_REQ_SUM AS PAYMENT_FILE_ID 
    FROM 
     SP.TSP_CP_HIST hist left join 
     SP.TSP_CP_PAYT_RQ_DTL PAYT ON PAYT.I_PAYT_REF = hist.I_PAYT_REF 
    WHERE hist.C_HIST_TYPE ='V' 
+0

你語句不正確,子查詢沒有'from'條款 –

+0

這是爲我工作的答案太如果沒有條件,我很不熟悉。但其他建議工作太:) –

2

有時你可能會需要那種內嵌如果,這是一個CASE條款,它的工作原理是直列如果:)

select 
    hist.I_PAYT_REF as PAY_REF, 
    hist.C_USERID as USER_ID, 
    case 
     when hist.I_PAYT_REF is null then PAYT.I_PAYT_REQ_SUM 
     else null 
    end as PAYMENT_FILE_ID 
from sp.TSP_CP_HIST as hist 
    left outer join SP.TSP_CP_PAYT_RQ_DTL as PAYT on PAYT.I_PAYT_REF = hist.I_PAYT_REF 
where hist.C_HIST_TYPE ='V' 

但作爲@簡森 - 按鈕 - 事件說 - 有沒有點在這裏使用case - 如果I_PAYT_REF爲null,則left outer joinSP.TSP_CP_PAYT_RQ_DTL返回任何記錄。所以,你可以寫只是

select 
    hist.I_PAYT_REF as PAY_REF, 
    hist.C_USERID as USER_ID, 
    PAYT.I_PAYT_REQ_SUM 
from sp.TSP_CP_HIST as hist 
    left outer join SP.TSP_CP_PAYT_RQ_DTL as PAYT on PAYT.I_PAYT_REF = hist.I_PAYT_REF 
where hist.C_HIST_TYPE ='V' 
+0

您的「案例」是多餘的看到我的回答是 –

+0

右鍵錯過了它同場 –

0

加入這兩個表並在您的select子句中應用CASE聲明。

SELECT 
    hist.I_PAYT_REF AS PAY_REF, 
    hist.C_USERID AS USER_ID, 
    CASE WHEN hist.I_PAYT_REF IS NULL 
     THEN PAYT.I_PAYT_REQ_SUM 
     ELSE I_PAYT_REF 
    END as PAYMENT_FILE_ID 
FROM sp.TSP_CP_HIST hist 
     INNER JOIN SP.TSP_CP_PAYT_RQ_DTL AS PAYT 
       ON PAYT.I_PAYT_REF = hist.I_PAYT_REF 
WHERE hist.C_HIST_TYPE ='V' 
+0

我覺得這是更好地使用'左外join',而不是'內join'或者你會錯過一些數據,但是這取決於模式 –

+0

也有兩個'ON'關鍵字在' JOIN'條款 –

+0

@RomanPekar是的,由於*複製粘貼* –