1

我有一个 SQL 查询,其中我必须从不同的表中获取额外的参数,只有当主表中存在一个值时。我尝试过使用 if else 子句,但它从来没有用过。

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不为空的情况下获取一个新参数。任何帮助将不胜感激。

谢谢,耶斯万斯

4

3 回答 3

2

有时你可能需要那种 inline if,它是一个CASE子句,它的工作方式类似于 inline if :)

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'

但正如@jenson-button-event 所说 - 这里没有必要使用case- 如果I_PAYT_REF为 null 则不left outer join返回任何记录SP.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'
于 2012-10-27T15:05:43.323 回答
2

您只需要一个左连接,如果I_PAYT_REF为 null,则连接不会排除主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'
于 2012-10-27T15:07:02.403 回答
0

加入两个表并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'
于 2012-10-27T15:07:02.867 回答