SQL выбирает все, если параметр равен нулю, иначе возвращает определенный элемент

#sql #sql-server

#sql-server

Вопрос:

Есть ли способ написать следующий скрипт, чтобы он возвращал все продукты, если переменная ProductID равна null ? И возвращает определенный продукт, когда продукт не равен нулю. Что у меня есть до сих пор:

 DECLARE @productID INT = NULL

SELECT
    ProductID,
    ProductName,
    ProductDesc 
FROM
    product 
WHERE
    ProductID = @productID
  

Ответ №1:

Инструкция варианта использования:

 SELECT ProductID, ProductName,ProductDesc 
FROM product 
WHERE ProductID = CASE WHEN @productID IS NULL THEN ProductID ELSE @productID END
  

Или функция IIF(), если вы используете SQL Server 2012:

 SELECT ProductID, ProductName,ProductDesc 
FROM product 
WHERE ProductID =IIF(@productID IS NULL, ProductID, @productID )
  

Комментарии:

1. вау, не знал, что в 2012 году в нем была функция IIF, я просто не могу дождаться, когда моя компания обновится до 2012

Ответ №2:

Почему бы просто не:

 DECLARE @productID INT = NULL

SELECT ProductID, ProductName,ProductDesc 
FROM   product 
WHERE  ProductID = @productID
OR     @productID IS NULL;
  

Вот демонстрация в SQLFiddle с NULL и значением для @ProductID

Комментарии:

1. Это обобщает гораздо лучше. Например, если вы хотите использовать диапазон значений, когда @productId IS NULL вы можете сделать WHERE ProductId = @ProductId OR (@ProductId IS NULL AND ProductId BETWEEN @Min and @Max) .

Ответ №3:

Попробуйте это

 DECLARE @productID INT = NULL

SELECT 
    ProductID,
    ProductName,
    ProductDesc 
FROM
    product 
WHERE 
    ProductID = isnull(@productID,ProductID)
  

Ответ №4:

Производительность невероятно улучшается при использовании CASE оператора:

 SELECT ProductID, ProductName,ProductDesc 
FROM product 
WHERE ProductID = CASE WHEN @productID IS NULL THEN ProductID ELSE @productID END
  

ISNULL() предотвращает использование оптимизатором индекса в этом столбце.

Ответ №5:

 SELECT
    ProductID,
    ProductName,
    ProductDesc 
FROM
    product 
WHERE
    ProductID = CASE WHEN @productID IS NULL THEN ProductID ELSE @productID END
  

Ответ №6:

Поскольку «» не распознается как NULL я использовал значение

 SELECT ProductID, ProductName,ProductDesc 
FROM product 
WHERE ProductID =IIF(@productID =1, ProductID, @productID )
  

В моем коде:

  MyDataAdapter.SelectCommand.Parameters("@productID").Value = 1