2012-02-02 3 views
0

У меня есть запрос, который я создаю для приложения. База данных настроена в SQL Server 2008. Я хочу использовать запрос, подобный ниже, однако я буду использовать это предложение «Where» для примерно 4 других столбцов, используя те же требования. Является ли это подходящим способом проверить значение null или '' в столбце, который является VarChar (255), и разрешает null.SQL Search Query With Null и ''

В идеале, если переменная @UutSerialNumber является пустой или пустой (''), я хочу получить все результаты, но если это не так, я хочу использовать предложение LIKE. Это правильный способ сделать это и будет ли он работать? Кажется, что это работает до тех пор, пока я не добавлю больше столбцов в предложение Where.

Кроме того, как бы я обрабатывал тип данных «text», используя тот же тип запроса?

SELECT DeviceName, UutStatus FROM MyTable WHERE (UutSerialNumber LIKE '%' + @UutSerialNumber + '%' OR UutSerialNumber LIKE '%%' AND (@UutSerialNumber = '' OR @UutSerialNumber IS NULL)) AND ...

Помощь ценится. Всем спасибо!

+0

Что вы ожидаете с этим фильтром: 'ИЛИ UutSerialNumber LIKE '%%''? – Lamak

+0

У меня было впечатление, что это будет означать выбор всего. Поэтому, если параметр имеет значение null или '', не фильтруйте его в этом столбце. – ImGreg

+1

Но у вас это есть на 'OR', поэтому если' UutSerialNumber' имеет некоторое значение (и это отличается от выбора всего, так как это не учитывает значения «NULL»), тогда он не будет фильтроваться, независимым от значения вашего параметра – Lamak

ответ

1

Это Amy кажется, что дублирование SQL, но лучший способ сделать это с точки зрения Performace использует IF ... ELSE

IF ISNULL(@UutSerialNumber, '') = '' 
    BEGIN 
     SELECT DeviceName, UutStatus 
     FROM MyTable 
     -- MORE EXPRESSIONS 
    END 
ELSE 
    BEGIN 
     SELECT DeviceName, UutStatus 
     FROM MyTable 
     WHERE (UutSerialNumber LIKE '%' + @UutSerialNumber + '%' 
     -- MORE EXPRESSIONS 
    END 

Это может быть сделано в ИНЕКЕ, если вы делаете это на нескольких столбцах, и запрос, который вы опубликовали, был не за горами, он просто пропускал дополнительную скобку вместе с избыточным предложением.

SELECT DeviceName, UutStatus 
FROM MyTable 
WHERE (ISNULL(@UutSerialNumber, '') = '' OR UutSerialNumber LIKE '%' + @UutSerialNumber + '%') 
AND  (ISNULL(@AnotherParameter, '') = '' OR AnotherColumn LIKE '%' + @AnotherParameter + '%') 

Конвертировать текст в VARCHAR (MAX).

в качестве сноски, лично я бы использовать CHARINDEX вместо конкатенации строк в как:

WHERE (ISNULL(@UutSerialNumber, '') = '' OR CHARINDEX(@UutSerialNumber, UutSerialNumber) > 0) 

Это не более чем сноской, однако, как я не сделал ничего тестирования производительности, я просто думаю, что это легче на глаза!

+0

. Не будет ли конвертация в Varchar очень дорогой с точки зрения эффективности, если вы запрашиваете, скажем, строки 100 тыс.? Любые временные решения? – ImGreg

+0

Измените структуру таблицы так, чтобы столбец хранится как varchar (max), тем самым устраняя необходимость в преобразовании? Текст и nText являются обнуляемыми и будут удалены из будущих версий SQL, поэтому для будущей проверки все равно придется менять тип данных столбца. – GarethD

+0

База данных I ' m, для этого я не могу изменить. Существуют ограничения для этой базы данных, так как они используются для живых данных, находящихся вне моего контроля. – ImGreg

1
SELECT DeviceName, UutStatus 
FROM MyTable 
WHERE ((@UutSerialNumber = '') OR (@UutSerialNumber is null)) OR (UutSerialNumber like @UutSerialNumber) 

добавить '%' до последнего @UutSerialNumber, если вы считаете, что вам нужно

+0

Кажется, это работает так, как я этого хотел. Отлично. Как я могу использовать этот запрос для столбца «текст». похоже, не принимает текст в качестве входного параметра. – ImGreg

+1

Тип текста, который вы имеете в виду?попробуйте использовать его как varchar. – Diego