webentwicklung-frage-antwort-db.com.de

Wie kann ich am besten überprüfen, ob in Oracle ein Datensatz vorhanden ist?

EIN) 

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) noch etwas (bitte angeben)

BEARBEITEN: Es war schwierig, die "richtige" Antwort zu wählen, da der beste Ansatz davon abhängt, was Sie tun möchten, nachdem Sie geprüft haben, ob der Wert vorhanden ist, wie von APC ausgeführt. Am Ende habe ich die Antwort von RedFilter ausgewählt, da ich diese Überprüfung ursprünglich als Funktion für sich betrachtet hatte.

34
Zesty
select case 
            when exists (select 1 
                         from sales 
                         where sales_type = 'Accessories') 
            then 'Y' 
            else 'N' 
        end as rec_exists
from dual;
70
RedFilter

Was ist die zugrunde liegende Logik, die Sie implementieren möchten? Wenn Sie zum Beispiel das Vorhandensein eines Datensatzes testen möchten, um festzustellen, ob er eingefügt oder aktualisiert werden soll, wäre die Verwendung von MERGE die bessere Wahl.

Wenn Sie davon ausgehen, dass der Datensatz die meiste Zeit vorhanden ist, ist dies wahrscheinlich die effizienteste Vorgehensweise (obwohl die Lösung CASE WHEN EXISTS wahrscheinlich genauso effizient ist): 

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;

Sie benötigen die ROWNUM-Zeile nur, wenn SALES_TYPE nicht eindeutig ist. Es ist sinnlos zu zählen, wenn Sie nur wissen möchten, ob mindestens ein Datensatz vorhanden ist. 

13
APC
select count(1) into existence 
   from sales where sales_type = 'Accessories' and rownum=1;

Der Oracle-Plan sagt, dass es 1 kostet, wenn die Spalte von seles_type indiziert ist.

8
tyger

hier können Sie nur y, n überprüfen, wenn Sie auch einen Namen auswählen müssen, ob dieser Name existiert oder nicht.

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

Wenn es nur Y ist, wird die Ausgabe zurückgegeben, andernfalls wird immer Null ausgegeben. Auf diese Weise erhalten Sie die mit N nicht vorhandenen Datensätze wie in der Ausgabe. Wir erhalten Name, N. Wenn der Name nicht in der Tabelle vorhanden ist

1
Aashish
select NVL ((select 'Y' from  dual where exists
   (select  1 from sales where sales_type = 'Accessories')),'N') as rec_exists
from dual

1.Dual-Tabelle gibt 'J' zurück, wenn ein Datensatz in der Tabelle sales_type vorhanden ist 2.Dual-Tabelle gibt Null zurück, wenn in der Tabelle sales_type kein Datensatz vorhanden ist, und NVL konvertiert diesen Wert in 'N'

0
Awknewbie

Die effizienteste und sicherste Methode, um festzustellen, ob eine Zeile existiert, ist die Verwendung von FOR-LOOP ..... Sie werden es nicht einmal schwer haben, eine Zeile einzufügen oder etwas zu tun, das NICHT auf der Zeile basiert Wenn Sie dort sind, wird dies sicherlich hilfreich sein, wenn Sie feststellen müssen, ob eine Zeile vorhanden ist. Siehe Beispielcode unten für die Ins und Outs ...

Wenn Sie nur wissen möchten, dass in Ihrem potenziellen Set mit mehrfachen Rückgaben 1 Datensatz vorhanden ist, können Sie die Schleife beenden, nachdem Sie sie zum ersten Mal getroffen haben. 

Die Schleife wird überhaupt nicht gestartet, wenn kein Datensatz vorhanden ist. Sie erhalten keine Beschwerden von Oracle oder dergleichen, wenn die Zeile nicht vorhanden ist, Sie jedoch unbedingt herausfinden müssen, ob dies der Fall ist. Ich verwende 90% der Zeit (natürlich abhängig von meinen Bedürfnissen) ...

BEISPIEL: 

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;

--Dies ist hier außerhalb der Schleife. Der IF-CHECK oben wird trotzdem ausgeführt, aber dann wissen Sie, ob Ihre Variable null oder nicht richtig ist!?. Wenn KEINE Datensätze zurückgegeben wurden, wird die Schleife übersprungen, und Sie gelangen hier zu dem Code, den Sie als Nächstes haben würden. Wenn (in unserem Fall oben) 4 Datensätze zurückgegeben würden, würde ich nach der ersten Iteration aufgrund meines EXIT-Befehls beenden ; ... Wenn dies nicht der Fall wäre, würden die 4 Datensätze durchlaufen und alle einfügen. Oder versuche es zumindest auch.

Ich sage übrigens nicht, dass dies der einzige Weg ist, auf den Sie achten sollten ... Sie können 

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

Dann überprüfe es wie  

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

Es gibt mehr Möglichkeiten ... Bestimmen Sie es einfach, wenn sich Ihr Bedarf ergibt. Denken Sie an Leistung und Sicherheit.

0
Jeremy
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
nofil qureshi
select decode(count(*), 0, 'N', 'Y') rec_exists 
      from sales 
      where sales_type = 'Accessories'; 
0
Randy