Как вывести значения «NULL» или «0» для значений столбцов, когда элемент не найден? - PullRequest
1 голос
/ 14 января 2011

Мне нужно перебрать набор значений (меньше 10) и посмотреть, есть ли они в таблице. Если это так, мне нужно распечатать все значения записи, но если элемент не существует, я все же хочу, чтобы он был включен в результат печати, хотя со значениями NULL или 0 Так, например, следующий запрос возвращает:

select * 
  from ACTOR 
 where ID in (4, 5, 15);

+----+-----------------------------+-------------+----------+------+
| ID | NAME                        | DESCRIPTION | ORDER_ID | TYPE |
+----+-----------------------------+-------------+----------+------+
|  4 | [TEST-1]                    |             |        3 | NULL |
|  5 | [TEST-2]                    |             |        4 | NULL |
+----+-----------------------------+-------------+----------+------+
Но я хочу это вернуть
+----+-----------------------------+-------------+----------+------+
| ID | NAME                        | DESCRIPTION | ORDER_ID | TYPE |
+----+-----------------------------+-------------+----------+------+
|  4 | [TEST-1]                    |             |        3 | NULL |
|  5 | [TEST-2]                    |             |        4 | NULL |
|  15| NULL                        |             |        0 | NULL |
+----+-----------------------------+-------------+----------+------+

Возможно ли это?

Ответы [ 6 ]

8 голосов
/ 14 января 2011

Чтобы получить желаемый результат, сначала необходимо создать производную таблицу, содержащую желаемые значения ACTOR.id. UNION ALL работает для небольших наборов данных:

SELECT *
  FROM (SELECT 4 AS actor_id
          FROM DUAL
        UNION ALL
        SELECT 5
          FROM DUAL
        UNION ALL
        SELECT 15
          FROM DUAL) x

С этим вы можете ВНЕШНЕЕ СОЕДИНИТЬ с фактической таблицей, чтобы получить желаемые результаты:

   SELECT x.actor_id,
          a.name,
          a.description,
          a.orderid,
          a.type
     FROM (SELECT 4 AS actor_id
             FROM DUAL
           UNION ALL
           SELECT 5
             FROM DUAL
           UNION ALL
           SELECT 15
             FROM DUAL) x
LEFT JOIN ACTOR a ON a.id = x.actor_id

Если между x и a нет совпадения, столбцы a будут нулевыми. Поэтому, если вы хотите, чтобы orderid был равен нулю, когда нет совпадения для идентификатора 15:

   SELECT x.actor_id,
          a.name,
          a.description,
          COALESCE(a.orderid, 0) AS orderid,
          a.type
     FROM (SELECT 4 AS actor_id
             FROM DUAL
           UNION ALL
           SELECT 5
             FROM DUAL
           UNION ALL
           SELECT 15
             FROM DUAL) x
LEFT JOIN ACTOR a ON a.id = x.actor_id
3 голосов
/ 14 января 2011

Ну, для этих нескольких значений вы могли бы сделать что-то уродливое, как это, я полагаю:

SELECT 
   *
FROM
   (
      SELECT 4 AS id UNION 
      SELECT 5 UNION 
      SELECT 15
    ) ids 
      LEFT JOIN ACTOR ON ids.id = ACTOR.ID

(Я думаю, это должно работать в MySQL; для Oracle вам нужно использовать DUALнапример, SELECT 4 as id FROM DUAL...)

0 голосов
/ 14 января 2011

Можете ли вы сделать таблицу, которая содержит ожидаемые идентификаторы актеров?

Если это так, вы можете присоединиться к нему.

SELECT * FROM expected_actors LEFT JOIN actors USING (ID)
0 голосов
/ 14 января 2011

Если вы знаете верхний и нижний пределы ID, это не так уж плохо.Настройте представление со всеми возможными идентификаторами - трюк с подключением - самый простой способ - и выполните внешнее соединение с вашей реальной таблицей.Здесь я ограничил его значениями от 1 до 1000.

select * from (
   select ids.id, a.name, a.description, nvl(a.order_id,0), a.type
   from Actor a,
        (SELECT level as id from dual CONNECT BY LEVEL <= 1000) ids
   where ids.id = a.id (+)
)
where id in (4,5,15);
0 голосов
/ 14 января 2011
CREATE TABLE actor_temp (id INTEGER);
INSERT INTO actor_temp VALUES(4);
INSERT INTO actor_temp VALUES(5);
INSERT INTO actor_temp VALUES(15);
select actor_temp.id, ACTOR.* from ACTOR RIGHT JOIN actor_temp on ACTOR.id = actor_temp.id;
DROP TABLE actor_temp;
0 голосов
/ 14 января 2011

Это возможно только при использовании временной таблицы .

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