Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como lidar com parâmetros opcionais na consulta SQL?


Sim, usando qualquer um dos seguintes:
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);

...não são sargáveis. Eles funcionarão, mas executarão a pior das opções disponíveis.

Se você tiver apenas um parâmetro, as instruções IF/ELSE e separadas e personalizadas são uma alternativa melhor.

A próxima opção depois disso é o SQL dinâmico. Mas codificar SQL dinâmico é inútil se você carregar os predicados não sargáveis ​​no primeiro exemplo. O SQL dinâmico permite que você personalize a consulta enquanto acomoda vários caminhos. Mas também corre o risco de injeção de SQL, por isso deve ser executado por trás de consultas parametrizadas (de preferência dentro de procedimentos/funções armazenados em packages.