Условное где предложение?

Я хочу применить условие, где clause Это, если мой параметр barcode имеет значение null, тогда я хочу получить все записи, и если он приходит со значением, тогда я хочу извлечь только совпадающие записи для второй части, я могу получить соответствующие записи но я застреваю при извлечении всех записей в случае нулевого значения, которое я пробовал, как показано ниже,

  SELECT item FROM tempTable WHERE ((ISNULL(@barcode,0)=1) // but this is not fetching all the records if barcode is null OR ISNULL(@barcode,0!= 1 AND tempTable.barcode LIKE @barcode+'%')) //THis is working perfect -  SELECT item FROM tempTable WHERE ((ISNULL(@barcode,0)=1) // but this is not fetching all the records if barcode is null OR ISNULL(@barcode,0!= 1 AND tempTable.barcode LIKE @barcode+'%')) //THis is working perfect 

поэтому любая помощь будет большой

Возможно, я неправильно понял, что вы просите, но логический оператор OR может помочь:

 SELECT item FROM tempTable WHERE @barcode IS NULL OR tempTable.barcode LIKE @barcode+'%' 

Если @barcode равен NULL , он возвращает все записи, а когда он не равен NULL , он возвращает все записи, которые соответствуют условию LIKE @barcode+'%'

Важный

Кроме того, имейте в виду, что использование оператора OR может, по-видимому, вызывать смешные результаты при использовании с несколькими сложными условиями AND-ed вместе и не прилагаться должным образом в фигурных скобках:

 <A> AND <B> AND <C> OR <D> AND <E> AND <F> 

Скорее всего, скорее всего, можно сформулировать так:

 (<A> AND <B> AND <C>) OR (<D> AND <E> AND <F>) 

Помните, что парсер не знает, чего вы хотите достичь, вы должны правильно описать свои намерения …

Я думаю, вы могли бы упростить его:

  SELECT item FROM tempTable WHERE @barcode IS NULL OR tempTable.barcode LIKE @barcode+'%' 

поэтому, когда @barcode равно null, вы получите все – то есть часть Like, где не нужно будет выполнять. Если @barcode имеет значение, то будет выполнено действие Like.

Если поле штрих-кода не равно null, то это метод, который я бы использовал –

 SELECT item FROM tempTable WHERE barcode like isnull(@barcode, barcode) + '%' 

Если @barcode имеет значение null, все записи возвращаются, и если он не равен нулю, возвращаются только соответствующие записи.

Если поле штрих-кода является нулевым, тогда –

 SELECT item FROM tempTable WHERE isnull(barcode, '') like isnull(@barcode, isnull(barcode, '')) + '%' 

То же, что и в первом, но здесь мы преобразуем нулевые значения в поле штрих-кода в пустые строки перед выполнением сравнения.

Альтернативный ответ и попытка щедрости

 declare @barcode nvarchar(10) -- chose nvarchar not necessarily should be nvarchar select @barcode= NULL --select @barcode='XYZ' if @barcode is null select item from temptable; else select item from temptable where temptable.barcode like @barcode+'%'; 

Если я должен это сделать, я бы сделал так

 SELECT item FROM tempTable WHERE ( ( ISNULL(@barcode,'') <> '') AND ( tempTable.barcode LIKE @barcode+'%' ) ) 

( ISNULL(@barcode,'') <> '') также проверит, является ли переменная пустой, и она ничего не должна возвращать. Но если вы просто проверяете значение null, то в случае, когда @barcode пуст, вы получите весь item выбранный из tempTable .

Если barcode столбца будет недействительным, вы можете значительно упростить запрос. Это основано на том, что шаблон '%' соответствует любой строке; даже пустую (т.е. нулевую) строку. Следовательно, следующее предложение WHERE соответствует всем записям:

 WHERE barcode LIKE '%' 

Вы можете заметить, что это имеет очень близкое сходство с предложением WHERE, которое вы используете для фильтрации записей по конкретному штрих-коду:

 WHERE barcode LIKE @barcode + '%' 

На самом деле, они настолько похожи, что мы можем использовать одно предложение WHERE для обоих случаев; в конце концов, '' + '%' равно '%' !

 IF @barcode IS NULL SET @barcode = '' SELECT item FROM tempTable WHERE barcode LIKE @barcode + '%' 

Существует еще более короткая версия, которая сохраняет исходное значение @barcode :

 SELECT item FROM tempTable WHERE barcode LIKE ISNULL(@barcode, '') + '%' 

Как упоминалось ранее, это работает только в том случае, если barcode столбца не имеет значения NULL. Если barcode столбца является нулевым (и вы действительно заинтересованы в записи, где barcode IS NULL ), следующий запрос может сработать для вас:

 SELECT item FROM tempTable WHERE ISNULL(barcode, '') LIKE ISNULL(@barcode, '') + '%' 

Однако эта версия имеет два недостатка:

  • Он может работать намного медленнее, потому что оптимизатор запросов может не воспользоваться индексом на barcode столбца.
  • Если @barcode = '' , то он будет соответствовать не только ненулевым штрих-кодам, но также и записи со barcode IS NULL ; является ли это приемлемым, зависит от вас.

Последнее упрощение: вы можете достичь консенсуса с внешним миром, что они должны установить @barcode = '' вместо NULL для извлечения всех записей. Затем вы можете заменить ISNULL(@barcode, '') на @barcode .

Помимо решения ppeterka (что приведет к индексу / сканированию таблиц) есть как минимум три других решения. Эти решения могут использовать Index Seek если @barcode не является NULL, а также, если есть индекс в столбце barcode :

Решение № 2: план выполнения не кэшируется и не используется повторно:

 SELECT item FROM tempTable WHERE @barcode IS NULL OR tempTable.barcode LIKE @barcode+'%' OPTION(RECOMPILE); 

Решение № 3: план выполнения кэшируется (его можно использовать, если число необязательных параметров невелико):

 IF @barcode IS NULL SELECT item FROM tempTable; ELSE SELECT item FROM tempTable WHERE tempTable.barcode LIKE @barcode+'%'; 

Решение № 4: планы выполнения кэшируются (его можно использовать, если число необязательных параметров велико):

 DECLARE @SqlStatement NVARCHAR(MAX); SET @SqlStatement = N' SELECT item FROM tempTable WHERE 1=1 ' + CASE WHEN @barcode IS NULL THEN N'' ELSE N'AND tempTable.barcode LIKE @pBarcode+''%''; ' END; -- + CASE WHEN @anotherparam IS NULL THEN N'' ELSE 'AND ...' END ; EXEC sp_executesql @SqlStatement, N'@pBarcode VARCHAR(10)', @pBarcode = @barcode; 

Примечание. Используйте подходящий тип и макс. lenght / precision & scale для параметра @pBarcode .

IF @barcode имеет значение null

начать

SELECT item FROM tempTable

конец

else SELECT item FROM tempTable, где tempTable.barcode LIKE @barcode + '%'

  • SQL Server параметризовал запрос с предложением WHERE с помощью Nulls
  • T-SQL Group с помощью предложения where
  • Условное предложение «Где» и пользовательская функция
  • Помощь с условием запроса SQL Server
  • Left Outer Join, только если столбец существует (сервер SQL)
  • T-sql ", где orderid% 2 = 0", что означает%
  • Установите критерии, которые будут использоваться в нескольких запросах выбора SQL
  • where, чтобы искать значения из нескольких столбцов в sql-сервере
  • Сравнение условных строк SQL в разделе Where where
  • Завершение предложения where в sql-сервере
  • Динамическое построение, в котором условие в выражении SQL
  • Interesting Posts

    SQL для группировки и агрегирования на основе разных типов записей

    Разрешения требуют, чтобы GRANT EXECUTE

    Почему эта программа perl с подключением DBI к серверу MS SQL через утечку памяти ODBC?

    Классический asp конвертирует varchar в int в SQL-запросе с использованием SQL Server 2014

    Почему некластеризованный индексный столбец по-прежнему выполняет сканирование индекса вместо поиска индекса

    Вытяните данные из текстового файла перед добавлением его в таблицу в SQL Server 2005 DTS

    Как получить разницу в дате между двумя датами в том же году с одной датой – с даты ввода не с года

    SQL Server, вычисляя общее количество часов в день с несколькими перерывами

    Как я могу использовать SqlDataReader для получения сгруппированных данных, возвращаемых хранимой процедурой?

    SSIS – производные столбцы

    sp_executesql не возвращает значение

    Как просмотреть определение хранимой процедуры, которое невозможно изменить в SQL Server 2008 R2?

    sql по порядку и сверху в одном запросе

    Запрос SQL Server для Всего часов в нескольких рядах

    Удаление строк базы данных и их ссылок – передовая практика

    Давайте будем гением компьютера.