2012-04-03 10 views
0

私は高度な検索sprocで作業していますが、私の選択の一部がパラメータに含まれているかどうかを知ることができるかどうかを知りたいと思います。私は自分のパラメータにIF ELSEを使用することができましたが、私は既に別のパラメータを持っています。これはコードの重複のようです。SQL Server - INTERSECTをオプションで選択する方法

- 高度な検索機能を使用すると、さまざまなパラメータを指定できます。基本的な検索はEXACTかどうか(vs freetext - 最初のifを含む)、他のパラメータ(AND)を指定できます。特定のキーワードも選択(交差)することができます。

私の問題は、@Keywordsがnullの場合、私の例の最後にコードの最後のINTERSECT SELECT ...部分を含めたくないということです。トップとボトムのクエリに別のIF ELSEを追加することなくこれを行う簡単な方法はありますか?より詳細な情報が必要な場合はお知らせください。

declare @SearchTerms nvarchar(4000) 
declare @GalleryId int 
declare @Keywords nvarchar(4000) 
declare @ExactWord int 
declare @BeginDateUpload datetime 
declare @EndDateUpload datetime 
declare @BeginDateTaken datetime 
declare @EndDateTaken datetime 
declare @MinFileSize int 
declare @MaxFileSize int 
declare @AlbumType bit 
declare @ImageType int 
declare @AudioType int 
declare @OtherType int 
declare @VideoType int 

set @SearchTerms = 'tulips' 
set @GalleryId = 1 
set @Keywords = null -- 'st-jean' 
set @ExactWord = null 
set @BeginDateUpload = null 
set @EndDateUpload = null 
set @BeginDateTaken = null 
set @EndDateTaken = null 
set @MinFileSize = null 
set @MaxFileSize = null 
set @AlbumType = 1 
set @ImageType = 1 
set @AudioType = 1 
set @OtherType = 1 
set @VideoType = 1 
IF ISNULL(@ExactWord, 0) = 1 
    BEGIN 
      [... snip ...] 
    END 
ELSE 
    select t1.* from ( 
    SELECT 'm' as objType, m.MediaObjectId 
    FROM gs_mediaObjectMetadata md 
     INNER JOIN dbo.[gs_MediaObject] m 
     ON md.FKMediaObjectId = m.MediaObjectId 
     INNER JOIN dbo.[gs_Album] a 
     ON a.AlbumId = m.FKAlbumId 
     WHERE FREETEXT (value, @SearchTerms) 
     AND a.FKGalleryId = @GalleryId 
     AND (m.DateAdded >= ISNULL(@BeginDateUpload, m.DateAdded)) 
     AND (m.DateAdded <= ISNULL(@EndDateUpload, m.DateAdded)) 
     AND (m.DateTaken is NULL OR m.DateTaken >= ISNULL(@BeginDateTaken, m.DateTaken)) 
     AND (m.DateTaken is NULL OR m.DateTaken <= ISNULL(@EndDateTaken, m.DateTaken)) 
     AND (m.OriginalSizeKB >= ISNULL(@MinFileSize, m.OriginalSizeKB)) 
     AND (m.OriginalSizeKB <= ISNULL(@MaxFileSize, m.OriginalSizeKB)) 
     AND((m.FKMediaObjectTypeId = ISNULL(@ImageType, 0)) 
     OR (m.FKMediaObjectTypeId = ISNULL(@AudioType, 0)) 
     OR (m.FKMediaObjectTypeId = ISNULL(@VideoType, 0)) 
     OR (m.FKMediaObjectTypeId = ISNULL(@OtherType, 0))) 



union 

     SELECT 'm' as objType, m.MediaObjectId 
FROM dbo.[gs_MediaObject] m 
     INNER JOIN dbo.[gs_Album] a 
     ON a.AlbumId = m.FKAlbumId 
     WHERE FREETEXT ((m.Title, OriginalFilename), @SearchTerms) 
     AND a.FKGalleryId = @GalleryId 
     AND (m.DateAdded >= ISNULL(@BeginDateUpload, m.DateAdded)) 
     AND (m.DateAdded <= ISNULL(@EndDateUpload, m.DateAdded)) 
     AND (m.DateTaken is NULL OR m.DateTaken >= ISNULL(@BeginDateTaken, m.DateTaken)) 
     AND (m.DateTaken is NULL OR m.DateTaken <= ISNULL(@EndDateTaken, m.DateTaken)) 
     AND (m.OriginalSizeKB >= ISNULL(@MinFileSize, m.OriginalSizeKB)) 
     AND (m.OriginalSizeKB <= ISNULL(@MaxFileSize, m.OriginalSizeKB)) 
     AND((m.FKMediaObjectTypeId = ISNULL(@ImageType, 0)) 
     OR (m.FKMediaObjectTypeId = ISNULL(@AudioType, 0)) 
     OR (m.FKMediaObjectTypeId = ISNULL(@VideoType, 0)) 
     OR (m.FKMediaObjectTypeId = ISNULL(@OtherType, 0))) 
    ) t1 
--IF @Keywords != null -- conditional intersect 
intersect 

     SELECT 'm' as objType, m.MediaObjectId 
FROM dbo.[gs_MediaObject] m 
     INNER JOIN dbo.[gs_Album] a 
     ON a.AlbumId = m.FKAlbumId 
     left join dbo.gs_MediaObjectMetadata md 
     on m.MediaObjectId = md.FKMediaObjectId 
     WHERE FREETEXT ((m.Title, OriginalFilename), @SearchTerms) 
     AND a.FKGalleryId = @GalleryId 
     AND (m.DateAdded >= ISNULL(@BeginDateUpload, m.DateAdded)) 
     AND (m.DateAdded <= ISNULL(@EndDateUpload, m.DateAdded)) 
     AND (m.DateTaken is NULL OR m.DateTaken >= ISNULL(@BeginDateTaken, m.DateTaken)) 
     AND (m.DateTaken is NULL OR m.DateTaken <= ISNULL(@EndDateTaken, m.DateTaken)) 
     AND (m.OriginalSizeKB >= ISNULL(@MinFileSize, m.OriginalSizeKB)) 
     AND (m.OriginalSizeKB <= ISNULL(@MaxFileSize, m.OriginalSizeKB)) 
     AND((m.FKMediaObjectTypeId = ISNULL(@ImageType, 0)) 
     OR (m.FKMediaObjectTypeId = ISNULL(@AudioType, 0)) 
     OR (m.FKMediaObjectTypeId = ISNULL(@VideoType, 0)) 
     OR (m.FKMediaObjectTypeId = ISNULL(@OtherType, 0))) 

and UPPER(md.Description) = 'KEYWORDS' 
     and exists (
       SELECT * 
       FROM dbo.fnSplit(Replace(md.Value, '''', ''''''), ',') split 
       WHERE split.item in 
       (SELECT * from dbo.fnSplit(Replace(@Keywords, '''', ''''''), ',')) 
     ) 

ありがとう

答えて

0

何についての代わりに交差を行うので、あなたの内側のクエリでこれを試してみる:@Keywordがnullかです.....

 and (@Keywords is null or (UPPER(md.Description) = 'KEYWORDS' 
     and exists (
       SELECT * 
       FROM dbo.fnSplit(Replace(md.Value, '''', ''''''), ',') split 
       WHERE split.item in 
       (SELECT * from dbo.fnSplit(Replace(@Keywords, '''', ''''''), ',')) 
      ) 
     ) 
     ) 
+0

おかげで先端のために、それはそのままのコードでは動作しませんが、私はそれを動作させることができるかどうかを確認していきます – crichard

関連する問題