sql >> Databasteknik >  >> RDS >> Oracle

Hur hanterar man valfria parametrar i SQL-fråga?

Ja, med något av följande:

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);

...är inte sargable. De kommer att fungera, men presterar det sämsta av de tillgängliga alternativen.

Om du bara har en parameter är IF/ELSE och separata, skräddarsydda uttalanden ett bättre alternativ.

Nästa alternativ efter det är dynamisk SQL. Men att koda dynamisk SQL är värdelös om du överför de icke-sargerbara predikaten i det första exemplet. Dynamisk SQL låter dig skräddarsy frågan samtidigt som du tar emot många sökvägar. Men det riskerar också SQL-injektion, så det bör utföras bakom parametriserade frågor (helst inom lagrade procedurer/funktioner i paket.



  1. Få den första dagen i månaden i PostgreSQL

  2. Markör i proceduren returnerar fler värden än fråga

  3. JSON_QUOTE() – Hur man undslipper tecken i strängar som används som JSON-värden i MySQL

  4. Är det möjligt att använda `SqlDbType.Structured` för att skicka tabellvärderade parametrar i NHibernate?