Como uma WHERE
cláusula deve ser construída, de modo que:
- Ele filtra por um determinado campo
- Se houver zero resultados para filtrar pelo campo mencionado, ele filtra por outro campo?
Por exemplo, se tivermos este esquema:
CREATE TABLE Items
(
[Id] INT PRIMARY KEY,
[FirstDate] DATETIME,
[SecondDate] DATETIME
);
... com estes registros:
INSERT INTO Items ([Id], [FirstDate], [SecondDate])
VALUES
(1, '2021-1-1', '2022-1-1'),
(2, '2022-1-1', '2023-1-1'),
(3, '2022-1-1', '2024-1-1'),
(4, '2024-1-1', '2025-1-1'),
(5, '2024-1-1', '2026-6-1')
... então eu quero filtrar por FirstDate
e SecondDate
, de modo que:
- Se especificarmos
FirstDate
eSecondDate
filtrar por2022-1-1
, os registros 2 e 3 serão retornados ( mas não 1! ). - Se especificarmos
FirstDate
eSecondDate
filtrar por2024-1-1
, os registros 4 e 5 serão retornados ( mas não 3! ). - Se especificarmos
FirstDate
eSecondDate
filtrar por2025-1-1
, o registro 4 será retornado.
Você pode essencialmente atingir seu objetivo, com uma única consulta, aproveitando um CTE e uma função de janela da seguinte forma:
A maneira como isso basicamente funciona é que o
IsMatchOnFirstDate
campo é calculado verificando todas as linhas daItems
tabela para ver se oFirstDate
campo corresponde à@SomeDate
variável e retornando o valor 1 para todas as linhas (daí a função de janela) quando há uma correspondência em qualquer uma das linhas .A seleção final do CTE então filtra
FirstDate
somente quandoIsMatchOnFirstDate = 1
(ou seja, somente quando pelo menos uma das linhas daItems
tabela tiver uma correspondência emFirstDate = @SomeDate
), caso contrário, filtraSecondDate
(já que nenhuma das linhas correspondeuFirstDate
ao calcularIsMatchOnFirstDate
).Parece um trabalho para uma tabela temporária Execute uma seleção de inserção na tabela temporária e use @@rowcount para descobrir quantas linhas foram inseridas. Adicione uma instrução if e execute condicionalmente a 2ª inserção de seleção. Por fim, selecione as linhas da tabela temporária para retornar os resultados