#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');
Я хотел бы написать запрос, который покажет:
фрукты, чипсы и 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;