ЕСЛИ в где где в доступе + C # - PullRequest
0 голосов
/ 06 сентября 2018

Как я могу сделать IFF внутри где, где я делаю фильтры, в моем случае я хочу, чтобы параметры, которые приходят со значением 0, не влияли на мой запрос, просто игнорировали их

string query = @"
SELECT 
    P.NombreCompleto

FROM (((((((Persona AS P 
    LEFT JOIN MarcacionTemp AS MTemp ON P.codPersona = MTemp.codPersona) 
    LEFT JOIN Horario AS Ho ON MTemp.codHorario = Ho.idHorario) 
    LEFT JOIN TipoMarcacion AS TMar ON MTemp.codTipoMarcacion = TMar.idMarcacion) 
    INNER JOIN Colegio AS C ON P.codColegio = C.codColegio) 
    INNER JOIN Entidad AS E ON P.codEntidad = E.codEntidad) 
    INNER JOIN Grado AS Gr ON P.codGrado = Gr.codGrado) 
    INNER JOIN Paralelo AS Pa ON P.codParalelo = Pa.codParalelo) 
    INNER JOIN Turno AS Tu ON P.codTurno = Tu.codTurno

WHERE P.codTipo = 4         
    IIF (@turno     == 0, AND P.codTurno = @turno       , )
    IIF (@grado     == 0, AND P.codGrado = @grado       , )
    IIF (@paralelo  == 0, AND P.codParalelo = @paralelo , )";


OleDbCommand command = new OleDbCommand(query, connection);

command.Parameters.AddWithValue("@fecha", dTPGrado.Value.Date);
command.Parameters.AddWithValue("@turno", codTurno);
command.Parameters.AddWithValue("@grado", codGrado);
command.Parameters.AddWithValue("@paralelo", codParalelo);

adapter.SelectCommand = command;
DataSet.Clear();

1 Ответ

0 голосов
/ 06 сентября 2018

Вы можете использовать iif в операторе where. Но синтаксис на первый взгляд не выглядит интуитивно понятным. Где ожидает логическое предложение, так что вы должны конвертировать

IIF (@turno     == 0, AND P.codTurno = @turno       , )

до

IIF (@turno= 0, -1, @turno) = P.codTurno

Обратите внимание, что каждый раз, когда параметр @turno имеет значение 0, мы изменяем его на -1 (или что-то, в чем вы уверены, что нет и не будет в этом столбце в базе данных.

Итак, в конце ваш код SQL должен выглядеть примерно так

SELECT 
P.NombreCompleto
FROM (((((((Persona AS P 
LEFT JOIN MarcacionTemp AS MTemp ON P.codPersona = MTemp.codPersona) 
LEFT JOIN Horario AS Ho ON MTemp.codHorario = Ho.idHorario) 
LEFT JOIN TipoMarcacion AS TMar ON MTemp.codTipoMarcacion = TMar.idMarcacion) 
INNER JOIN Colegio AS C ON P.codColegio = C.codColegio) 
INNER JOIN Entidad AS E ON P.codEntidad = E.codEntidad) 
INNER JOIN Grado AS Gr ON P.codGrado = Gr.codGrado) 
INNER JOIN Paralelo AS Pa ON P.codParalelo = Pa.codParalelo) 
INNER JOIN Turno AS Tu ON P.codTurno = Tu.codTurno
WHERE P.codTipo = 4       
[and/or] IIF (@turno=0, -1, @turno) = P.codTurno
[and/or] IIF (@grado=0,-1, @grado) = P.codGrado 
[and/or] IIF (@paralelo=0, -1, @paralelo) = P.codParalelo
...