Sql Server условно Содержит для свободной обработки текстового поиска параметра Null - PullRequest
1 голос
/ 19 сентября 2011

Я довольно долго пытался запустить этот запрос.

Короче, мой запрос выполняет поиск по fileno и / или полю поиска

DECLARE @pSearchFor AS NVARCHAR(100);

- я здесь тестирую с нулевым значением, '' или отдельными словами SET @pSearchFor = null - '"marsa" и "mosta"';

 IF ISNULL(@pSearchFor,'') = '' SET @pSearchFor = '""' ;

declare @fileNo nvarchar(50) = 'e/e'

select top 1000 r.FileId, r.FileNo,  fs.SearchField, @pSearchFor

from regfile as r
left outer join FileSearchFields as fs on r.FileId = fs.FileID
where r.FileNo like 
CASE 
 WHEN  Len(@fileno) > 1 THEN '%'+@fileNo+'%'
 ELSE r.FileNo
END

 AND 
     1 = 
     CASE WHEN ISNULL(@pSearchFor, '') = '' THEN 1 ELSE 0 END
       or CONTAINS(fs.SearchField, @pSearchFor)

Я ничего не получаю, если @pSearchFor равно нулю, иначе отлично работает.

Мне нужно вернуть все экземпляры, если ноль

Одним из возможных решений может быть вызов 2 отдельных sps или использование if / else, но, возможно, существует лучший метод.

Я действительно ценю вашу помощь!

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

Сначала вы установите @pSearchFor на "":

IF ISNULL(@pSearchFor,'') = '' SET @pSearchFor = '""' ;

Это означает, что это никогда не вернется 1:

CASE WHEN ISNULL(@pSearchFor, '') = '' THEN 1 ELSE 0 END

Вам нужно либо использовать другую переменную, либо использовать тот же тип выражения CASE в списке select вместо изменения значения с NULL на "".

SELECT TOP 1000 r.FileId, r.FileNo,  fs.SearchField, 
    CASE WHEN COALESCE(@pSearchFor, '') = '' THEN '""' ELSE @pSearchFor END

Также вы используете SELECT TOP, но не ORDER BY ... если вы хотите подмножество, вас не волнует, какое подмножество вы получите?

0 голосов
/ 27 сентября 2011

Я решил проблему.Может быть, это может помочь другим!Это фрагмент моей хранимой процедуры.

 @fileNo nvarchar(50) = null ,
 @fields nvarchar(100) = '""',`enter code here`
 @datefrom date = null,
 @dateto date  = null,
...
AS`enter code here`
BEGIN

 if (@fields = null or LEN(@fields) < 1 ) set @fields = '""'

select top 1000 r.*,
(CASE 
        WHEN fs.SearchField IS NULL THEN CONVERT(NVarChar(1),'')
        ELSE CONVERT(NVarChar(MAX),fs.SearchField)
     END) AS [Search]  
from regfile as r
left outer join FileSearchFields as fs on r.FileId = fs.FileID
where r.FileNo like 
CASE 
 WHEN  Len(@fileno) > 1 THEN '%'+@fileNo+'%'
 ELSE r.FileNo
 END
 and
  r.Date between 
CASE 
 WHEN  @datefrom != '' THEN @datefrom
 ELSE '1900-1-1'
 END

 and 
CASE 
 WHEN  @dateto != '' THEN @dateto
 ELSE '9999-1-1'
 END
 and 
 ((LEN(@fields) > 2 and contains(fs.SearchField,@fields))or (LEN(@fields) <= 2)) 
 --NB: <= 2 as we have added the "" characters in @fields!

end
...