Какой самый эффективный способ проверить, существует ли запись в Oracle? - PullRequest
37 голосов
/ 08 августа 2010

A)

select decode(count(*), 0, 'N', 'Y') rec_exists
from (select 'X'
      from dual
      where exists (select 'X'
                    from sales
                    where sales_type = 'Accessories'));

B)

select decode(count(*), 0, 'N', 'Y') rec_exists
from (select 'X'
      from sales
      where sales_type = 'Accessories'); 

C) Что-то еще (укажите)

РЕДАКТИРОВАТЬ: было трудно выбрать «правильный» ответ, так как лучший подход зависит от того, что вы хотите сделать после проверки, существует ли значение, как указано APC.Я закончил тем, что выбрал ответ от RedFilter, так как изначально я представлял эту проверку как функцию.

Ответы [ 10 ]

75 голосов
/ 08 августа 2010
select case 
            when exists (select 1 
                         from sales 
                         where sales_type = 'Accessories') 
            then 'Y' 
            else 'N' 
        end as rec_exists
from dual;
13 голосов
/ 08 августа 2010

Какую логику вы хотите реализовать? Если, например, вы хотите проверить наличие записи, чтобы определить, хотите ли вы вставить или обновить ее, лучше использовать вместо нее MERGE .

Если вы ожидаете, что запись будет существовать большую часть времени, это, вероятно, самый эффективный способ действий (хотя решение CASE WHIS 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 не уникален. Нет смысла проводить подсчет, когда все, что вы хотите знать, - это наличие хотя бы одной записи.

8 голосов
/ 30 мая 2013
select count(1) into existence 
   from sales where sales_type = 'Accessories' and rownum=1;

В плане Oracle указано, что если индексирован столбец seles_type, то он равен 1.

2 голосов
/ 20 июля 2012

здесь вы можете проверить только y, n если нам нужно также выбрать имя, то есть это имя существует или нет.

select name , decode(count(name),0, 'N', 'Y')
  from table
 group by name;

Здесь, когда это только Y, тогда он вернет выходные данные, иначе он всегда будет давать ноль. Как получить записи, не существующие с N, как в выводе, мы получим Name, N. Когда name не существует в таблице

1 голос
/ 08 августа 2010
select decode(count(*), 0, 'N', 'Y') rec_exists 
      from sales 
      where sales_type = 'Accessories'; 
0 голосов
/ 15 октября 2018
select CASE 
when exists (SELECT U.USERID,U.USERNAME,U.PASSWORDHASH
FROM  TBLUSERS U WHERE U.USERID =U.USERID 
AND U.PASSWORDHASH=U.PASSWORDHASH) 
then 'OLD PASSWORD EXISTS' 
else 'OLD PASSWORD NOT EXISTS' 
end as OUTPUT
from DUAL;
0 голосов
/ 30 августа 2017

Просто получите количество записей, которые вы ищете.Если число> 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;
0 голосов
/ 27 октября 2015

Самый эффективный и безопасный способ определить, существует ли строка, - это использовать FOR-LOOP ... У вас даже не будет трудного времени, если вы хотите вставить строку или сделать что-то, основываясь на том, что строки НЕ там, но это, безусловно, поможет вам, если вам нужно определить, существует ли строка. См. Пример кода ниже для входов и выходов ...

Если вас интересует только то, что в вашем потенциальном множественном множестве возвратов существует 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 записи, я бы завершил работу после первой итерации из-за моего выхода. ; ... Если бы этого не было, то 4 записи прошли бы итерацию и вставили бы все из них. Или хотя бы попробуй тоже.

Кстати, я не говорю, что это единственный способ, которым вы должны подумать об этом ... Вы можете

SELECT COUNT(*) INTO v_counter WHERE ******* etc...

Тогда отметьте это как

if v_counter > 0
      THEN
         --code goes here
   END IF;

Есть и другие способы ... Просто определите, когда возникнет ваша потребность. Помните о производительности и безопасности.

0 голосов
/ 31 марта 2014
select NVL ((select 'Y' from  dual where exists
   (select  1 from sales where sales_type = 'Accessories')),'N') as rec_exists
from dual

1.Двойная таблица вернет 'Y', если запись существует в таблице sales_type 2.Двойная таблица вернет ноль, если в таблице sales_type не существует записи, и NVL преобразует ее в 'N'

0 голосов
/ 08 августа 2010
SELECT 'Y' REC_EXISTS             
FROM SALES                       
WHERE SALES_TYPE = 'Accessories'

Результатом будет «Y» или NULL.Просто протестируйте против 'Y'

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