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.
select case
when exists (select 1
from sales
where sales_type = 'Accessories')
then 'Y'
else 'N'
end as rec_exists
from dual;
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.
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.
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
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'
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.
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;
select decode(count(*), 0, 'N', 'Y') rec_exists
from sales
where sales_type = 'Accessories';