Ответ 1
select case
when exists (select 1
from sales
where sales_type = 'Accessories')
then 'Y'
else 'N'
end as rec_exists
from dual;
A)
select decode(count(*), 0, 'N', 'Y') rec_exists
from (select 'X'
from dual
where exists (select 'X'
from sales
where sales_type = 'Accessories'));
В)
select decode(count(*), 0, 'N', 'Y') rec_exists
from (select 'X'
from sales
where sales_type = 'Accessories');
C) Что-то еще (указать)
РЕДАКТИРОВАТЬ: Трудно было выбрать правильный ответ, так как наилучший подход зависит от того, что вы хотите сделать после проверки того, существует ли значение, о чем указывает APC. Я закончил тем, что выбрал ответ RedFilter, так как я первоначально предполагал эту проверку как функцию сам по себе.
select case
when exists (select 1
from sales
where sales_type = 'Accessories')
then 'Y'
else 'N'
end as rec_exists
from dual;
Какова основная логика, которую вы хотите реализовать? Если, например, вы хотите проверить наличие записи для определения вставки или обновления, лучшим выбором было бы использовать MERGE вместо этого.
Если вы ожидаете, что запись будет существовать большую часть времени, это, вероятно, самый эффективный способ делать вещи (хотя решение CASE WHEN EXISTS, вероятно, будет так же эффективно):
begin
select null into dummy
from sales
where sales_type = 'Accessories'
and rownum = 1;
-- do things here when record exists
....
exception
when no_data_found then
-- do things here when record doesn't exists
.....
end;
Вам нужна только строка ROWNUM, если SALES_TYPE не уникален. Нет смысла делать подсчет, когда все, что вы хотите знать, - существует ли хотя бы одна запись.
select count(1) into existence
from sales where sales_type = 'Accessories' and rownum=1;
План Oracle говорит, что он стоит 1, если индексируется индекс seles_type.
здесь вы можете проверить только y, n если нам нужно также выбрать имя, независимо от того, существует ли это имя или нет.
select name , decode(count(name),0, 'N', 'Y')
from table
group by name;
Здесь, когда это Y, тогда он будет возвращать выход, иначе он будет давать null всегда. Какой способ получить записи, не существующие с N, как в выводе, мы получим Name, N. Когда имя не существует в таблице
select decode(count(*), 0, 'N', 'Y') rec_exists
from sales
where sales_type = 'Accessories';
select NVL ((select 'Y' from dual where exists
(select 1 from sales where sales_type = 'Accessories')),'N') as rec_exists
from dual
Таблица 1.Dual вернет 'Y', если запись существует в таблице sales_type Таблица 2.Dual возвращает значение null, если в таблице sales_type нет записи, а NVL преобразует ее в 'N'
Самый эффективный и безопасный способ определить, существует ли строка, используя FOR-LOOP... У вас даже не будет трудного времени, если вы хотите вставить строку или сделать что-то на основе строки NOT, но это, безусловно, поможет вам, если вам нужно определить, существует ли строка. См. Пример кода ниже для входов и выходов...
Если вам интересно только знать, что в вашем потенциальном множественном наборе ответов существует 1 запись, вы можете выйти из цикла после того, как она впервые попадет в нее.
Петля вообще не будет введена, если запись не существует. Вы не получите никаких жалоб от Oracle или таких, если строка не существует, но вы обязательно узнаете, что она делает независимо. Его то, что я использую в 90% случаев (конечно, зависит от моих потребностей)...
ПРИМЕР:
DECLARE
v_exist varchar2(20);
BEGIN
FOR rec IN
(SELECT LOT, COMPONENT
FROM TABLE
WHERE REF_DES = (SELECT REF_DES FROM TABLE2 WHERE ORDER = '1234')
AND ORDER = '1234')
LOOP
v_exist := "IT_EXISTS"
INSERT INTO EAT_SOME_SOUP_TABLE (LOT, COMPONENT)
VALUES (rec.LOT, rec.COMPONENT);**
--Since I don't want to do this for more than one iteration (just in case there may have been more than one record returned, I will EXIT;
EXIT;
END LOOP;
IF v_exist IS NULL
THEN
--do this
END IF;
END;
- Это вне цикла прямо здесь. IF-CHECK чуть выше будет работать независимо, но тогда вы узнаете, является ли ваша переменная нулевой или не прав!?. Если бы не было никаких возвращенных записей, он пропустил бы цикл и просто перешел сюда к следующему коду... Если (в нашем случае выше), было возвращено 4 записи, я бы вышел после первой итерации из-за моего EXIT;... Если этого не было, 4 записи будут проходить через и вставлять их во все. Или, по крайней мере, попробуйте тоже.
Кстати, я не говорю, что это единственный способ, которым вы должны это делать... Вы можете
SELECT COUNT(*) INTO v_counter WHERE ******* etc...
Затем проверьте его как
if v_counter > 0
THEN
--code goes here
END IF;
Есть больше способов... Просто определите, когда возникнет ваша потребность. Помните о производительности и безопасности.
Просто введите количество записей, которые вы ищете. Если count > 0, то записи существуют.
DECLARE rec_count NUMBER := 0; BEGIN select count(*) into rec_count from EMPLOYEETABLE WHERE employee_id = inEMPLOYEE_ID AND department_nbr = inDEPARTMENT_NBR; if rec_count > 0 then {UPDATE EMPLOYEETABLE} else {INSERT INTO EMPLOYEETABLE} end if; END;
SELECT 'Y' REC_EXISTS
FROM SALES
WHERE SALES_TYPE = 'Accessories'
Результат будет либо "Y", либо "NULL". Просто протестируйте против "Y"