2012-04-03 6 views
0

Ich arbeite an einer erweiterten Suche sproc und würde gerne wissen, ob es möglich ist, dass ein Teil meiner Auswahl auf einem Parameter basiert oder nicht. Ich könnte einen IF ELSE auf meinem Parameter verwenden, aber ich habe bereits einen für einen anderen Parameter, und das scheint wie eine Menge Code-Duplizierung.SQL Server - Wie wird eine INTERSECT-Option ausgewählt?

- Meine erweiterte Suchfunktion ermöglicht es einem Benutzer, verschiedene Parameter anzugeben. Die grundlegende Suche kann EXACT sein oder nicht (enthält vs. freetext - first if) und andere Parameter (AND) können angegeben werden. Bestimmte Schlüsselwörter können ebenfalls ausgewählt werden (Schnittpunkt).

Mein Problem ist, dass, wenn @Keywords NULL ist, ich nicht den endgültigen INTERSECT SELECT ... Teil des Codes am Ende meines Beispiels enthalten soll. Gibt es einen schnellen Weg, dies zu tun, ohne ein weiteres IF ELSE in den oberen und unteren Abfragen hinzuzufügen? Lassen Sie mich wissen, wenn Sie detailliertere Informationen benötigen.

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, '''', ''''''), ',')) 
     ) 

Danke

Antwort

0

Was stattdessen die schneiden zu tun, dies in Ihrer inneren Abfrage ausprobieren: @Keyword ist null oder .....

 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

Dank für die Spitze, Es funktioniert nicht mit dem Code, aber ich werde weiter optimieren, um zu sehen, ob ich es zum Laufen bringen kann – crichard

Verwandte Themen