2017-06-06 2 views
2

I Tabelle Gruppen mit 3 Reihen haben, ID, GROUP_NAME und PARENT_GROUP_ID, die Tabelle selbst stellt eine basische Gruppe-Untergruppe-Funktionalität. Beispiel ist: wenn mein Gruppenname ist - "Erste Gruppe" mit ID = 1, und es hat eine Untergruppe namens "Untergruppe" mit ID = 2 und PARENT_GROUP_ID = 1; Dies bedeutet, dass Untergruppe die Untergruppe der Gruppe mit ID = 1 Mein Problem ist, dass ich über ein Verfahren, das die Daten nach Parametern lädt (pn_parent_group_id eine Zahl)SQL-Abfrage in Oracle where-Klausel

CURSOR c1 IS 
SELECT * FROM GROUPS WHERE PARENT_GROUP_ID = pn_parent_group_id; 

Diese Abfrage funktioniert in Ordnung, wenn ich eine pn_parent_group_id in die Prozedur senden, und es findet alle notwendigen Untergruppen, aber wenn ich NULL an die pn_parent_group_id sende, funktioniert es falsch, weil es die ohne parent_group_id (dh nur Elterngruppen) zurückgeben soll. Ich weiß, dass meine Erklärung fehlt, aber ich hoffe, Sie haben die Idee, jede Hilfe würde geschätzt werden!

Antwort

5

Null ist nie gleich null. Sie müssen also einen expliziten Test für null zum Cursor hinzufügen.

CURSOR c1 IS 
    SELECT * FROM GROUPS 
    WHERE PARENT_GROUP_ID = pn_parent_group_id 
    or (pn_parent_group_id is null and parent_group_id is null); 
+0

großartige Lösung, funktioniert einwandfrei – Hatik

1

Sie können in der SYS_OP_MAP_NONNULL Funktion interessiert sein, die der Vergleich NULL = NULL sein TRUE ermöglicht.

CURSOR c1 IS 
    SELECT * FROM GROUPS 
    WHERE SYS_OP_MAP_NONNULL(parent_group_id) = SYS_OP_MAP_NONNULL(pn_parent_group_id); 

Diese Funktion wird in der Oracle-Dokumentation nicht direkt dokumentiert, aber in Thema Dokumentation erscheint - wie es für eine lange Zeit gewesen ist, ich denke, es ist unwahrscheinlich, dass es entfernt wird. Wie immer mit diesen Dingen, verwenden Sie nach eigenem Ermessen.