私は高度な検索 sproc に取り組んでおり、パラメーターに基づいて選択の一部を含めることができるかどうかを知りたいです。パラメータに IF ELSE を使用することもできましたが、別のパラメータにすでに IF ELSE を使用しているため、多くのコードが重複しているように見えます。
-- 高度な検索機能により、ユーザーはさまざまなパラメータを指定できます。基本検索は、EXACT かどうか (contains vs freetext - first 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, '''', ''''''), ','))
)
ありがとうございました