SQL Select Query Объединение двух запросов if / else, null, empty input - PullRequest
0 голосов
/ 17 октября 2018

Например, у меня есть таблица

State | Zip | CategoryID | ProductID
FL    |12345|     2      |  3
GA    |98765|     1      |  5
GA    |98765|     1      |  4

Моя цель - создать запрос, который соответствует состоянию, zip, categoryID и productID.Тем не менее, мой ввод для ProductID категории 2 может быть нулевым или пустой строкой от пользователя, потому что не всегда productID связан с вводом.Если categoryID == 2, это действительно не заботится о конкретном productID.Но если categoryID == 1, он заботится о productID.Есть ли if / else, который я мог бы сделать, если это категория 1, равна ли она вводу или пустой или пустой строке, а категория 2 проверяет идентификатор продукта?Или есть способ, которым я могу превратить оба этих запроса в один?

Если для категории 2 входным значением для productID может быть 3, но оно также может быть нулевым или пустой строкой.Итак, если это ноль, пустая строка или 3. Мне нужно, чтобы он возвращался.

FL    |12345|     2      |  3

select * from locationPurch l
where l.state = :state
and l.zip = :zip
and l.category = :category

Если категория 1, ввод для productID всегда будет там.Поэтому, если мы запрашиваем productID 4, он должен вернуть.

GA    |98765|     1      |  4

select * from locationPurch l
where l.state = :state
and l.zip = :zip
and l.categoryID = :category
and l.productID = :productID

Ответы [ 5 ]

0 голосов
/ 17 октября 2018

просто попробуйте это.

select * from locationPurch l
where l.state = :state
and l.zip = :zip
and l.categoryID = :category
and l.productID = case when :category = 1 then :productID else l.productID end

это даст вам ожидаемый результат

0 голосов
/ 17 октября 2018

Оформить запрос:

select *
from locationPurch l
where l.state = :state
  and l.zip = :zip
  and l.categoryID = :category
  and (
    l.categoryID = 2 or l.productID = :productID
  )

Если categoryID равно 2, он не будет заботиться о productID из-за оператора or.Если categoryID - это любое другое значение (включая 1), оно проверяет productID после оператора or.

Чтобы это работало, операнды заключены в скобки ANDed к остальной части предложения , где .

0 голосов
/ 17 октября 2018

Не ясно на 100%, какие условия вы ищете, но эта версия предполагает, что если ваш categoryid = 2, то мы не только получим строки, которые соответствуют: productID, но также мы сопоставим любую строку, где любой из параметров имеет значениеnull или таблица содержит нулевое значение.

Кстати, вы упоминаете пустую или пустую строку - я предполагаю, что они являются целыми числами в таблице и параметре, что означает, что они никогда не будут пустой строкой.Если это не так, тогда измените тесты для is null на isnull(l.productID,'')='' or isnull(:productID,'')=''

Ваш тест для categoryid также должен быть categoryID='2'

select l.*
from locationPurch l
where l.state = :state and
  l.zip = :zip and
  l.categoryID = :category and
  (l.productID = :productID 
     or (:category = 2 and (l.productID is null or :productID is null))
  )
0 голосов
/ 17 октября 2018

Это должно работать:

SELECT l.*
FROM locationPurch l
WHERE 
    -- we look just at categoryId 2
    (:category = 2 AND 
     l.CategoryId = 2 AND -- filter only products from Category 2 
     (
              :productId IS NULL OR -- :productId is not specified as filter
              (ISNULL(l.ProductId,-99) = :productId) OR -- :productId is specified
              (:productId IS NOT NULL AND l.ProductId IS NULL) -- :productId is specified but user hasn't inputed data for productId in table
     ) AND -- productId resolving
     (:state IS NULL OR l.state = :state) AND 
     (:zip IS NULL OR l.zip = :zip)
    ) 
    OR
    -- only category 1 is observed
    (:category = 1 AND 
     l.CategoryId = 1 AND -- filter only products from Category1 
     l.ProductId = :productId AND -- only specified productId 
     (:state IS NULL OR l.state = :state) AND -- if state is entered then use that state as filter
     (:zip IS NULL OR l.zip = :zip) -- if ZIP is entered use that zip as filter
    )

Редактировать: Часть 2

Вы можете объединять запросы, используя операторы UNION или UNION ALL, например:

select * from locationPurch l
where l.state = :state
and l.zip = :zip
and l.category = :category
and l.category = 1
UNION ALL
select * from locationPurch l
where l.state = :state
and l.zip = :zip
and l.categoryID = :category
and l.productID = :productID
and l.category = 2

* Это просто для того, чтобы показать, как использовать UNION, этот сценарий нуждается в дальнейшем улучшении с помощью предложений WHERE, которые я использовал в предыдущем запросе.

Но есть некоторые ограничения для использования UNION, читайте здесь о них: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-union-transact-sql.

0 голосов
/ 17 октября 2018

Делает ли это то, что вы хотите?

select l.*
from locationPurch l
where l.state = :state and
      l.zip = :zip and
      l.categoryID = :category and
      (:category <> 2 or l.productID = :productID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...