Oracle не поддерживает логический тип в SQL. Он существует в PL / SQL, но не может использоваться в запросе. Самое простое, что нужно сделать, это 1 = 1 для true и 0 = 1 для false. Я не уверен, оптимизатор оптимизирует их или нет, но я подозреваю, что влияние на производительность незначительно. Я использовал это, где число предикатов неизвестно до времени выполнения.
Я думаю, что эта конструкция превосходит все, что использует nvl
, coalesce
, decode
или case
, потому что они обходят нормальные индексы, и у меня они есть, приводят к сложным и медленным планам выполнения.
Итак, да, я бы сделал что-то вроде вас (не уверен, на каком языке вы строите этот запрос; это недопустимый PL / SQL. Также вы должны использовать переменные связывания, но это уже другая история):
sql = "SELECT x FROM y WHERE 1=1";
if (a != null)
{
sql += " AND a=" + a;
}
if (b != null)
{
sql += " AND b=" + b;
}
... etc.
Я думаю, что это лучше, чем предложение Гордона Линоффа, потому что в противном случае это было бы более сложным, потому что вам пришлось бы иметь другое условие для каждой проверки предиката, если был предыдущий предикат, т. Е. Нужно ли было включать AND
или нет. Это просто делает код более многословным, чтобы избежать одного, тривиального предложения в запросе.