SQL列参数使用或者逻辑

时间:2018-05-22 21:59:39

标签: sql oracle

如果标题具有误导性,我道歉。

我试图避免使用两个不同的查询。考虑到这一点,

我有以下示例查询

  SELECT COUNT (*) COUNT,
         SUM (AMT) AS DED_AMT,
         SUM (SURCOST),
         SUM (DEALSUM),
         NVL (TO_CHAR (SUM (RETAIL)), 'N/A') AS RETAIL,
         MNFCID
    FROM (SELECT B.ID, B.CD, A.*
            FROM OUTPUTS_A A JOIN OUTPUTS_B B ON A.ID = B.ID
           WHERE B.ID = :ID AND B.CD = UPPER (:CD))
GROUP BY ID;

返回您在第一个屏幕截图中看到的结果。enter image description here

注意,我在查询中传递了两个绑定变量:ID,:CD。他们必须一起去,这就是我在那里使用AND运算符的原因。

有时,我只有MFCID而不是:ID和:CD。

这是我想到的逻辑。

  1. 我想修改查询,以便我能够将MFCID作为绑定变量传递。让我们说:mfcid是我传递的变量。

  2. 如果我有以下值:ID和:CD,我将传递这些值并传递任何内容:mfcid。 (在任何意义上我都没有通过任何东西。这个字段可以为空)

  3. 如果我只有:mfcid handy的值,我将传递该值并传递任何内容:ID和:CD。 (在任何意义上我都没有通过任何东西。这个字段可以为空)

  4. 无论哪种方式它都应该给我相同的结果。

    我试过这样说:AND B.MNFCID = NVL(:MNFCID, B.MNFCID)但它需要永远,因为如果不通过任何东西它总是如此。

1 个答案:

答案 0 :(得分:0)

这样做你想要的吗?

SELECT COUNT(*) COUNT, SUM(AMT) AS DED_AMT, SUM(SURCOST),
       SUM(DEALSUM), NVL(TO_CHAR(SUM(RETAIL)), 'N/A') AS RETAIL,
       MNFCID
FROM OUTPUTS_A A JOIN
     OUTPUTS_B B 
     ON A.ID = B.ID
WHERE (B.ID = :ID OR :ID IS NULL) AND
      (B.CD = UPPER(:CD) OR :CD IS NULL)
GROUP BY B.ID;

如果这不起作用 - 它可能不起作用 - 您可能希望使用动态SQL,以便更容易使用适当的索引。