Возвращает значение по умолчанию для некоторых условий IN, не совпадающих - PullRequest
1 голос
/ 02 марта 2020

Я думаю, это не должно быть очень сложно. Я пишу код Oracle - SQL для извлечения данных из SQL:

select ID, Qty from TableOne where ID in ('A', 'B', 'C')

Я хочу, чтобы база данных показывала результат запроса, если есть совпадение для некоторых элементов в IN условие и возвращает значение по умолчанию, если нет совпадения для этих элементов в условии IN. Например, я хочу, чтобы результат был:

+----+-----------+
| ID |    Qty    |
+----+-----------+
| A  | 3         |
| A  | 5         |
| B  | 4         |
| C  | Not Found |
+----+-----------+

Если в таблице TableOne нет идентификатора = C.

Есть ли простой способ кодирования результата? Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 02 марта 2020

Используйте COALESCE, NVL или CASE с LEFT OUTER JOIN и укажите идентификаторы в условии факторинга подзапроса:

WITH ids_to_match( id ) AS (
  SELECT 'A' FROM DUAL UNION ALL
  SELECT 'B' FROM DUAL UNION ALL
  SELECT 'C' FROM DUAL
)
select i.ID,
       COALESCE( TO_CHAR(Qty), 'Not Found' ) AS Qty
from   ids_to_match i
       LEFT OUTER JOIN TableOne t
       ON ( t.id = i.id )

или используйте коллекцию и выражение коллекции таблицы :

select i.COLUMN_VALUE AS ID,
       COALESCE( TO_CHAR(Qty), 'Not Found' ) AS Qty
from   TABLE( SYS.ODCIVARCHAR2LIST( 'A', 'B', 'C' ) ) i
       LEFT OUTER JOIN
       TableOne t
       ON ( t.id = i.COLUMN_VALUE )
2 голосов
/ 02 марта 2020

Вы можете использовать LEFT JOIN с UNION ALL:

WITH ALL_ID AS (
     SELECT 'A' AS ID FROM DUAL UNION ALL
     SELECT 'B' AS ID FROM DUAL UNION ALL
     SELECT 'C' AS ID FROM DUAL 
)
SELECT A.ID, t.Qty -- REPLACE NULL WITH NOT FOUND
FROM ALL_ID A ID LEFT JOIN
     Table t
      ON t.ID = A.ID;
0 голосов
/ 02 марта 2020

, если это работает для вас:

   select t2.ID, case when t2.QTY is NULL then TO_CHAR('Not found') else t2.QTY end "QTY" from TableOnet1 t1 right join Tabletwo t2
on t1.ID = t2.ID where t2.ID in ('A', 'B', 'C')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...