Переменная привязки параметра столбца SQL с помощью либо логики - PullRequest
0 голосов
/ 23 мая 2018

Я прошу прощения, если название вводит в заблуждение.

Я стараюсь избегать использования двух разных запросов.Имея это в виду,

У меня есть следующий пример запроса

  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.(Ничего в том смысле, что я ничего не пропущу. Это поле не может быть нулевым)

В любом случае оно должно вернуть мне тот же результат.

Iпытался выразить это так: AND B.MNFCID = NVL(:MNFCID, B.MNFCID), но это занимает вечность, потому что это всегда так, если ничего не пропустить.

1 Ответ

0 голосов
/ 23 мая 2018

Делает ли это то, что вам нужно?

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, чтобы соответствующие индексы можно было с большей готовностью использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...