#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