Oracle SQL-IF/CASE语句选择特定的内部联接

Oracle SQL-IF/CASE语句选择特定的内部联接,sql,oracle,Sql,Oracle,这是我的SQL SELECT DISTINCT AID.INVOICE_ID, AID.AMOUNT, AID.PERIOD_NAME, GCC.SEGMENT1 as Organisation, GCC.SEGMENT2, GCC.SEGMENT3, GCC.SEGMENT4, INV.INVOICE_NUM, INV.CREATION_DATE, PO.SEGMENT1 as PO_Number, SUP.VENDOR_NAM

这是我的SQL

SELECT DISTINCT
   AID.INVOICE_ID,
   AID.AMOUNT,
   AID.PERIOD_NAME,
   GCC.SEGMENT1 as Organisation,
   GCC.SEGMENT2,
   GCC.SEGMENT3,
   GCC.SEGMENT4,
   INV.INVOICE_NUM,
   INV.CREATION_DATE,
   PO.SEGMENT1 as PO_Number,
   SUP.VENDOR_NAME,
   AID.LINE_TYPE_LOOKUP_CODE,
   LINES.LINE_NUMBER
FROM
   AP_INVOICES_All INV 
   INNER JOIN
      AP_INVOICE_LINES_ALL LINES 
      ON INV.INVOICE_ID = LINES.INVOICE_ID 
   INNER JOIN
      AP_INVOICE_DISTRIBUTIONS_ALL AID 
      ON INV.INVOICE_ID = AID.INVOICE_ID 
   INNER JOIN
      GL_CODE_COMBINATIONS GCC 
      ON AID.DIST_CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID 
   INNER JOIN
      POZ_SUPPLIERS_V SUP 
      ON INV.VENDOR_ID = SUP.VENDOR_ID 
   LEFT JOIN
      PO_HEADERS_ALL PO 
      ON LINES.PO_HEADER_ID = PO.PO_HEADER_ID 
   LEFT JOIN
      PO_DISTRIBUTIONS_ALL PDA 
      ON INV.INVOICE_ID = PDA.PO_DISTRIBUTIONS_ALL 
WHERE
   AID.LINE_TYPE_LOOKUP_CODE NOT IN 
   (
      'REC_TAX',
      'NONREC_TAX'
   )
   AND LINES.LINE_TYPE_LOOKUP_CODE NOT IN 
   (
      'TAX'
   )

END


ORDER BY
   AID.INVOICE_ID,
   LINES.LINE_NUMBER
我正在看类似下面的东西。我想说的是,如果PO.SEGMENT为null,则使用指定的联接从表中选择列。根据PO.SEGMENT是否为null,在联接中使用不同的列。这容易实现吗

CASE 

WHEN PO.SEGMENT IS NOT NULL 
THEN SEGMENT1,SEGMENT2,SEGMENT3,SEGMENT4 
FROM GCC.CODE_COMBINATION_ID 
WHERE PDA.CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID

WHEN PO.SEGMENT IS NULL 
THEN SEGMENT1,SEGMENT2,SEGMENT3,SEGMENT4 
FROM GCC.CODE_COMBINATION_ID 
WHERE AID.DIST_CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID

END 

如何重新表述您的逻辑,使您只需要一个ON子句:


我省略了查询其余部分的其他细节,但我建议这样做,因为通过仔细的逻辑可以实现您想要的结果。

这是一个很好的方法,不过我要补充的是,整个ON语句需要用括号括起来,否则您可能会留下一个OR语句,这将导致笛卡尔积。
ON
    (PO.SEGMENT IS NOT NULL AND PDA.CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID) OR
    (PO.SEGMENT IS NULL AND AID.DIST_CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID)