首页 > 解决方案 > 如何修改查询并在 WHERE 语句中添加 IF/ELSE

问题描述

我陷入了一个问题,我不知道如何解决它。到目前为止,我在这里看了几个帖子,但找不到解决方案

发布 1 号

我有这样的查询

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 )最后再添加一个,但仍然有问题。你能帮我在这里找到问题吗?

标签: oracleplsql

解决方案


您不能在 SQL 中使用 IF,它不是语言的一部分。允许的语法在文档中。您似乎正在尝试使用其他语言或工具的构造 - 看起来像 Excel?- 而不是甲骨文会识别的东西。

您可以使用 case 表达式来执行此操作,但在这里并不合适,您的逻辑可以简化为:

AND
   (aa.TableType = 'Default' OR coalesce(si.Invoiced, sir.Invoiced) = 1)

您可以使用coalesce()or nvl(),但 coalesce 更加灵活和标准。

如果aa.TableType可以为 null 并且您想排除这些行,那么您可能需要添加一点,但看起来没有必要。


推荐阅读