Справка по простым SQL-запросам - PullRequest
1 голос
/ 16 марта 2011

Я строю запрос для поиска в MS SQL 05

У меня есть 4 вещи, которые пользователь может выбрать, и я хочу использовать логику AND для него.

, но я могу 'Кажется, он не работает, когда в него передаются значения NULL.

вот что у меня есть:

ALTER PROCEDURE [dbo].[sp_FindSource] 
    -- Add the parameters for the stored procedure here
 @Code varchar(500),
  @ssid varchar(50),
  @serialNo varchar(50),
  @category decimal(10,5)


as begin
SELECT *
FROM tblSource 
WHERE Code IN (
            SELECT Value
            FROM funcListToTableInt(@Code,',')
                   )
and SSID LIKE '%' + @ssID + '%'
and serialNo LIKE '%' + @serialNo + '%'
and category = @category




end

ПРИМЕЧАНИЕ: функция funcListToTableInt, анализирует разделенные запятыми значения, переданные (сам, если я возьму другие операторы where)

Приведенный выше поиск никогда ничего не возвращает, как я могу игнорировать значения, если они передаются черным, и запрашивать только те из них, которые содержат в себе что-то?тьфу, это убивает меня.

Ответы [ 3 ]

3 голосов
/ 16 марта 2011

Вам просто нужно обернуть несколько проверок OR @param IS NULL в соответствии с условиями WHERE:

ALTER PROCEDURE [dbo].[sp_FindSource] 
    -- Add the parameters for the stored procedure here
 @Code varchar(500),
  @ssid varchar(50),
  @serialNo varchar(50),
  @category decimal(10,5)


as begin
SELECT *
FROM  tblSource 
WHERE (Code IN (SELECT Value FROM funcListToTableInt(@Code,',')) OR @Code IS NULL)
      AND (SiteSourceID LIKE '%' + @ssID + '%' OR @ssID IS NULL)
      AND (serialNo LIKE '%' + @serialNo + '%' OR @serialNo IS NULL)
      AND (category = @category OR @category IS NULL)

end

На первый взгляд это выглядит очень странно, поскольку проверяет параметры для IS NULL, но работает.

1 голос
/ 16 марта 2011

Попробуйте добавить предложения OR для нулей. Так, например, измените 'and category = @category' на 'и ((category = @category) или (category is null)).

Сделайте это для всех элементов, для которых вы хотите иметь нулевой импульс, по сути, отключите этот конкретный тест.

0 голосов
/ 16 марта 2011

Существует два способа:

Способ 1, ДОБАВИТЬ ИЛИ Предложение: Это может убить производительность ....

SELECT *
FROM tblSource 
WHERE (Code IN (
            SELECT Value
            FROM funcListToTableInt(@Code,',')
                   ) OR @Code IS NULL)
and (SiteSourceID LIKE '%' + @ssID + '%' OR @SSID IS NULL)
and (serialNo LIKE '%' + @serialNo + '%' OR @serialNo IS NULL)
and (category = @category OR @category)

Способ 2: Условная логика Учитывая, что у вас есть 4 параметра икаждый может иметь значение или может не иметь значения, поэтому у вас есть 2 * 2 * 2 * 2, 16 разных случаев.Вы можете написать что-то вроде:

IF (@SSID IS NULL AND @Code IS NULL AND @serialNo IS NULL AND @category  IS NOT NULL) THEN
-- SEARCH only of category
ELSE IF (@SSID IS NULL AND @Code IS NULL AND @serialNo IS NOT NULL AND @category  IS  NULL) THEN
-- SEARCH only on Serial Number

.
.
.
.
.

Как и в SQL Server для каждого. Если блок кэширует свой собственный план, он будет более производительным, но на основе параметров и возможных комбинаций этот подход может или не может быть желательным..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...