Estou tentando criar um SQL que selecionará linhas com base na entrada do usuário. Uma das opções será o usuário selecionar todas as linhas.
Considere este exemplo:
WITH CTE_PROMPT AS (
SELECT 'M' Gender
),
CTE_DATA AS (
SELECT PERSON_NUMBER
,SEX
FROM Employees
)
SELECT CTE_DATA.*
FROM CTE_DATA
LEFT OUTER JOIN CTE_PROMPT ON CTE_DATA.Sex = CTE_PROMPT.Gender
WHERE CASE
WHEN Gender = 'ALL' THEN 1
WHEN Gender = SEX THEN 1
ELSE 0
END = 1
Os resultados corretos são mostrados quando o usuário seleciona 'M' ou 'F', mas nada é mostrado se o usuário seleciona 'ALL'. Como escrevo o SQL para que a opção 'ALL' mostre todos os registros?
Eu sugeriria contra uma
CASE
expressão, pois a cláusula não seria SARGable e, em vez disso, usaria umOR
. Como, no entanto, a declaração sofreria facilmente com sniffing de parâmetros, eu adicionaria umRECOMPILE
àOPTION
cláusula.Isso resulta no seguinte:
Uma solução melhor pode ser usar SQL dinâmico. Certifique-se de passar os parâmetros corretamente. Isso permitirá que o compilador adapte o plano de consulta à consulta.
Adaptei a resposta do @ThomA com o seguinte código (obviamente, este não é código de produção):
Isso funciona. Por algum motivo, ele não gostou da consulta CTE_PROMPT sem uma tabela.