Вам нужны записи из Foo, где Bar = @param, или, если @param равно нулю, где Bar равно нулю. Некоторые из предложенных решений дадут вам нулевые записи с ненулевым @param, что не соответствует вашему требованию.
Select * from Foo where (@param is null and Bar is null) or (Bar = @param)
Это не говорит, является ли это Oracle, SQL Server или другой RDBMS, потому что каждый из них реализует немного разные вспомогательные функции. SQL ISNULL (первый, второй), как NVL (первый, второй). Мне нравится SQL Server COALESCE () для общей применимости.
Сравнение IS только для нулевых сравнений.
Если вы используете SQL Server и вам действительно нужна другая таблица логики истинности 3VL для решения вашей проблемы (то есть, если у вас есть особая потребность, чтобы "NULL = NULL" было "true" «в какой-то момент времени, а также признать, что это устарело и исключает ваши причины (в общем, не очень хорошая идея), внутри вашего блока кода вы можете использовать директиву
SET ANSI_NULLS OFF
Вот BOL на нем:
http://msdn.microsoft.com/en-us/library/ms188048.aspx