Использование регистра при возвращаемом значении подзапроса

#sql #oracle #oracle11g

#sql #Oracle #oracle11g

Вопрос:

Я хотел бы написать case предложение, которое принимает входные данные из внутреннего запроса. Пожалуйста, позвольте мне описать это более подробно.

Допустим, у меня есть таблица:

 create table food
(   fruit varchar2(50),
    chips varchar2(50)
);
  

значениями

 INSERT INTO food
(fruit, chips)
VALUES ('Apple', 'Paprika');

INSERT INTO food
(fruit, chips)
VALUES ('Orange', 'Salt');
  

Скрипта DB

Я хотел бы написать запрос, который покажет:

фрукты, чипсы и 1, если фрукт — «Яблоко», и 0 в противном случае

что дало бы результат (пример)

 'Apple', 'Paprika', 1
'Orange, 'Salt', 0
  

Я не хочу использовать объединения для этого. Это должен быть подзапрос. Это требование, которое я должен выполнить.

Я придумал следующий запрос:

 select f.fruit,
((case (select ff.fruit from food ff)
when ff.fruit = 'Apple' then 1 else 0 end ) as is_apple) from food f;
  

Однако я получаю следующую ошибку ORA-00905: missing keyword

Комментарии:

1. Почему вы хотите использовать подзапрос? Я не вижу никаких подходящих причин.

2. @SuccessShrestha Пожалуйста, взгляните на мой обновленный пост.

Ответ №1:

Для этого вам не нужен подзапрос:

 select fruit, chips,
       case when fruit = 'Apple'
         then 1
         else 0
       end as is_apple
from food
  

Если значение должно быть результатом подзапроса, вы можете использовать:

 select fruit, chips,
       (select case when f2.fruit = 'Apple'
                 then 1
                 else 0
               end
        from food f2
        where f.rowid = f2.rowid
        )
from food f
  

Комментарии:

1. Спасибо за это, но подзапрос является обязательным — это не мне решать. Я обновил свой пост, чтобы отразить эту потребность.

Ответ №2:

Если это должен быть подзапрос, то используйте dual :

 select fruit, chips, 
      (select case food.fruit when 'Apple' then 1 else 0 end from dual) is_apple 
  from food;
  

или повторный выбор из food с использованием первичного ключа (если он содержится в вашей таблице), или rowid :

 select fruit, chips, 
      case (select fruit from food ff where ff.rowid = food.rowid) 
          when 'Apple' then 1 
          else 0 
      end is_apple 
  from food;
  

ДЕМОНСТРАЦИЯ