Мы уже много раз использовали 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 '\')
Большая проблема возникает, хотя, если вы хотите дополнительно фильтровать столбец, который также может иметь значение NULL ... если данные в столбце null
для данной строки И пользователь не вводил ничего для поиска этот столбец (так что пользовательский ввод также null
), тогда эта строка даже не будет отображаться в результатах (что, если ваши фильтры являются необязательными, является некорректным поведением исключения).
Чтобы компенсировать пустые поля, вам нужно будет сделать 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))