Если класс Object не является классом java.lang.Object
(учебник не включает импорт, поэтому его трудно увидеть), extends Object
является избыточным.
select tblVillas.*, tblWeeklyPrices.price
from tblVillas
INNER JOIN tblWeeklyPrices on tblVillas.villaId = tblWeeklyPrices.villaFK
where (@accomodationFK IS null OR accomodationTypeFK = @accomodationFK)
AND (@regionFK IS null or regionFK = @regionFK)
AND (@sleeps IS null OR sleeps = @sleeps)
AND (@priceFloor IS null OR (price BETWEEN @priceFloor And @priceCeil))
Мы использовали много из COALESCE
здесь в прошлом для" динамические операторы Where ", как Вы говорите о.
SELECT *
FROM vehicles
WHERE ([vin] LIKE COALESCE(@vin, [vin]) + '%' ESCAPE '\')
AND ([year] LIKE COALESCE(@year, [year]) + '%' ESCAPE '\')
AND ([make] LIKE COALESCE(@make, [make]) + '%' ESCAPE '\')
AND ([model] LIKE COALESCE(@model, [model]) + '%' ESCAPE '\')
А большая проблема возникает, хотя то, когда Вы хотите дополнительно отфильтровать для столбца, который также nullable..., если данные в столбце null
для данной строки И пользователя, не ввело ничего для поиска тот столбец (таким образом, ввод данных пользователем также null
), затем та строка даже не обнаружится в результатах (который, если фильтры являются дополнительными, неправильное исключающее поведение).
для компенсации nullable полей, Вы заканчиваете тем, что имели необходимость сделать более грязно выглядящий SQL как так:
SELECT *
FROM vehicles
WHERE (([vin] LIKE COALESCE(@vin, [vin]) + '%' ESCAPE '\')
OR (@vin IS NULL AND [vin] IS NULL))
AND (([year] LIKE COALESCE(@year, [year]) + '%' ESCAPE '\')
OR (@year IS NULL AND [year] IS NULL))
AND (([make] LIKE COALESCE(@make, [make]) + '%' ESCAPE '\')
OR (@make IS NULL AND [make] IS NULL))
AND (([model] LIKE COALESCE(@model, [model]) + '%' ESCAPE '\')
OR (@model IS NULL AND [model] IS NULL))
Именно так Вы понимаете, ЕСЛИ процессуальный кодекс в T-SQL. Это не может использоваться во вставить/обновить/удалить/выбрать операторе, который это может только использоваться для определения, какой из двух операторов Вы хотите выполнить. При необходимости в различных возможностях в операторе можно сделать как выше или использовать Оператор выбора.
Можно также использовать IsNull или Объединить функцию
Where accomodationTypeFK = IsNull(@accomodationFK, accomodationTypeFK)
And regionFK = Coalesce(@regionFK,regionFK)
And sleeps = IsNull(@sleeps,sleeps )
And price Between IsNull(@priceFloor, Price) And IsNull(priceCeil, Price)
, Это делает то же самое как предложение Michael выше...
IsNull (), и Объединяют () работу более или менее тот же путь, они возвращают первый ненулевой аргумент в списке, кроме iSNull только позволяет 2 аргумента, и Объедините, может взять любое число...
http://blogs.msdn.com/sqltips/archive/2008/06/26/differences-between-isnull-and-coalesce.aspx
Попробуйте поместить ваш IF оператор вокруг всего SQL оператора. Это значит, что для каждого условия будет один SQL-оператор. Это сработало.