Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie behandelt man optionale Parameter in einer SQL-Abfrage?

Ja, mit einem der folgenden:

WHERE m.id_pk = NVL(n_RequiredId, m.id_pk);
WHERE m.id_pk = COALESCE(n_RequiredId, m.id_pk);
WHERE (n_RequiredId IS NULL OR m.id_pk = n_RequiredId);

...sind nicht tragbar. Sie werden funktionieren, aber die schlechteste der verfügbaren Optionen ausführen.

Wenn Sie nur einen Parameter haben, sind IF/ELSE und separate, maßgeschneiderte Anweisungen eine bessere Alternative.

Die nächste Option danach ist dynamisches SQL. Das Codieren von dynamischem SQL ist jedoch nutzlos, wenn Sie die nicht-sargable Prädikate aus dem ersten Beispiel übernehmen. Mit Dynamic SQL können Sie die Abfrage anpassen und gleichzeitig zahlreiche Pfade berücksichtigen. Aber es riskiert auch SQL-Injection, also sollte es hinter parametrisierten Abfragen durchgeführt werden (vorzugsweise innerhalb gespeicherter Prozeduren/Funktionen in Paketen.