Wie man eine bedingte where-Klausel mit where in PL/SQL innerhalb der Prozedur
Ich habe eine ziemlich einfache Gespeicherte Prozedur, die ich in Schwierigkeiten bin, das zu tun, weil ich bin neu in SQL und PL/SQL. Ich Habe eine Tabelle mit einem Namen-Spalte, die den Datentyp varchar(55).
Entdeckte ich, dass, wenn der Benutzer führt mein Verfahren mit einem leeren string als Parameter die WIE statment bringt alle Zeilen aus TABELLE1
SELECT *
FROM TABLE1
WHERE COLUMN LIKE VARIABLE || '%'
AND...
So, ich habe versucht, ändern Sie die Abfrage so, wenn die VARIABLE, die übergeben wird mit einem leeren string kann immer noch durchführen, andere Bedingungen in der where-Anweisung.
SELECT *
FROM TABLE1
WHERE (VARIABLE <> '' AND COLUMN LIKE VARIABLE || '%')
AND...
Aber jetzt, wo ich den pass als variable (", NULL, 'anystring') bekomme ich keine Zeilen zurückgegeben.
Wie kann ich eine Abfrage erstellen, die überprüft, ob die variable unterscheidet sich von einer leeren Zeichenfolge, und wenn es ist, es führt den LIKE-Anweisung mit der Variablen korrekt?
WHERE (VARIABLE IS NULL OR COLUMN LIKE VARIABLE || '%') AND...
- Nun ist die Abfrage immer wieder Wert auch mit " als Parameter
- Ich entfernte die "UND" - Anweisung und jetzt habe ich getestet mit nur der LIKE-Anweisung...gleiche Ergebnis. Alle Zeilen
WHERE ((VARIABLE = '' OR VARIABLE IS NULL) AND VARIABLE || '%')
- Nun, wenn pass " - Wert zu Variablen es gibt null Zeilen und wenn nicht, pass es gibt alle Werte... =( Hab nicht gedacht, dass diese Sache ist, wie dieses schwer zu tun
- beachten Sie, dass in Oracle
VARIABLE = ''
immer mit unknown ausgewertet, weil''
null ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich Sie richtig verstehe, ist es nicht eine schwierige Sache zu tun. Verwenden Sie bedingte WHERE-Klausel mit FALL, WENN. So wird die Abfrage unterstützen verschiedene Szenarien, etwa wie folgt:
Grundsätzlich wird überprüft, ob die
variable = ''
es wird dann vergleichen Sie die Spalte an''
. Sonst wird es zu vergleichen gegenvariable||'%'
.Bemerken, Oracle behandelt leere Zeichenkette vom Typ VARCHAR als NULL (dies gilt nicht für CHAR). So, im ersten Szenario, das wir vergleichen gegen NULL.
WHERE variable IS NULL AND column IS NULL OR variable LIKE '%' AND column LIKE variable||'%'
? Es ist einfacher, kürzer und verhindern nicht, dass Oracle zu tun, einige Optimierungen wie ODER expansion => docs.oracle.com/database/121/TGSQL/..., während die Abfrage muss immer ein full table scan und meldest den FALL expresiion auf alle Datensätze, eins nach dem anderen.Hallo, Nur ein Gedanke für diese können wir verwenden Dynamisches sql zu. Wenn Sie können, versuchen Sie diesen Ansatz. Hoffe, es hilft.