sql - Oracle SQL - IF/CASE 语句选择特定的内部连接
问题描述
这是我的 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 为空,则使用指定的连接从表中选择列。根据 PO.SEGMENT 是否为空,在连接中使用不同的列。这很容易实现吗?
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
(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)
我省略了您查询的其余部分的其他细节,但我建议这样做,因为通过仔细的逻辑可以实现您想要的。
推荐阅读
- jenkins - 使用 Jenkins 时如何更新 gitlab Merge Request 构建状态(管道状态)并且管道先前已取消/删除?
- django - 多对多关系字段的django rest框架列表
- php - 将成功消息传输到 ajax 中的重定向主页(本机 JS/非 JQUERY)
- reactjs - 如何减小 antdesign.less 文件的包大小?
- browser - 如何解决我的网站和同一域的网站之间的这个 CORS 问题?
- java - 如何在 pom.xml 中配置 projectId 使用两个项目时 google cloud
- python - 任何停止在excel中自动重新格式化数据的方法
- react-native - 如何导航回 React Native 中的上一个选项卡?
- security - 将安全字段存储在 cookie 中是否正确?
- c++ - Dev C++:如何修复“无法识别的 insn,内部编译器错误”(描述中的完整错误)