oracle - 如何修改查询并在 WHERE 语句中添加 IF/ELSE
问题描述
我陷入了一个问题,我不知道如何解决它。到目前为止,我在这里看了几个帖子,但找不到解决方案
我有这样的查询
SELECT
aa.Total
FROM
ata_articles aa
LEFT JOIN
weekly_report wr
ON
aa.wrId = wr.id
LEFT JOIN
supplier_invoices si
ON
aa.SupplierInvoiceId = si.SupplierInvoicesID
LEFT JOIN
supplier_invoice_rows sir
ON
aa.SupplierInvoiceId = sir.id
LEFT JOIN
ata a
ON
a.ATAID = aa.AtaID
WHERE
aa.AtaId = 1817
AND
((wr.status != 3 AND wr.status != 4) OR (aa.wrId = 0 AND a.PaymentType != 4))
AND
(IF (aa.TableType != 'Default', IF (si.Invoiced IS NULL, sir.Invoiced, si.Invoiced), NULL) = 1 OR aa.TableType = 'Default')
到目前为止,当我运行此查询时,我得到了错误
ORA-00907: missing right parenthesis
我尝试用 CASE 更改 IF,但仍然遇到同样的错误。我尝试bracket )
最后再添加一个,但仍然有问题。你能帮我在这里找到问题吗?
解决方案
您不能在 SQL 中使用 IF,它不是语言的一部分。允许的语法在文档中。您似乎正在尝试使用其他语言或工具的构造 - 看起来像 Excel?- 而不是甲骨文会识别的东西。
您可以使用 case 表达式来执行此操作,但在这里并不合适,您的逻辑可以简化为:
AND
(aa.TableType = 'Default' OR coalesce(si.Invoiced, sir.Invoiced) = 1)
您可以使用coalesce()
or nvl()
,但 coalesce 更加灵活和标准。
如果aa.TableType
可以为 null 并且您想排除这些行,那么您可能需要添加一点,但看起来没有必要。
推荐阅读
- terraform - Terraform:aws_iam_policy_document 中的条件语句块?
- oracle - 从时间戳获取oracle中的日期而不使用尾随o?
- vbscript - 将 .vbs 文件单独分组,而不是一次全部分组
- python - 如何在 Python 中显示列表或双端队列的内容?
- c# - HtmlAgilityPack 中的 SelectNodes 始终返回 null
- mule - Dataweave - 使用另一个键作为 keyName 一部分的选择器
- mongodb - $project 是否允许将文档 JSON 中给定字段的所有子字段移动到上层?
- python - 如何导入和修补与测试不同的包中的 Python 模块?
- javascript - 如何在不使用 jQuery 的情况下从 CSS 伪事件触发 JavaScript 事件?
- robotframework - 为什么 Robot Framework、Selenium2Library、Element Text Should Be 关键字无法正确验证输入元素文本?