有没有一种干净的方法可以将下面的 SQL 组合成 1 条语句?FilterID 的长度可以为零,因此该Filters
表是可选的。所以,除非有更好的方法,否则我“被迫”使用下面的 EXISTS 逻辑。
我已经意识到......
我已经意识到我可以构建一个动态字符串并使用它EXEC
来运行它......但这很慢。
Document-to-DocumentMetadata 的关系是: 1 to Document
manyDocumentMetadata
的Filter-to-DocumentMetadata 的关系是:
1 to many的Filter
DocumentMetadata
SQL如下:
DECLARE @SearchTerms NVARCHAR(MAX)
DECLARE @FilterIDs VARCHAR(100)
SET @SearchTerms = '7%'
SET @FilterIDs = '12'
------------------------
DECLARE @Filters TABLE (FilterID int)
IF(@FilterIDs IS NOT NULL)
INSERT INTO @Filters SELECT items AS INT FROM Split(@filterIDs, ',')
IF EXISTS(SELECT FilterID FROM @Filters)
BEGIN
SELECT
Document.ID AS DocumentID
,Document.SourceID
,Document.Name
,Document.Title
,Document.DocumentUrl
,Document.DocType
,Document.DocumentModifiedDate
,Document.Library
,DocumentMetadata.ID AS DocumentMetadataID
,DocumentMetadata.DocumentID
,DocumentMetadata.FilterID
,DocumentMetadata.Value
FROM Document
JOIN DocumentMetadata
ON DocumentMetadata.DocumentID = Document.ID
JOIN Filter
ON Filter.ID = DocumentMetadata.FilterID
AND Filter.ID IN (SELECT FilterID FROM @Filters)
WHERE
Document.Name LIKE @SearchTerms
OR Document.Title LIKE @SearchTerms
ORDER BY
Document.Name, Document.Title
END
ELSE
BEGIN
SELECT
Document.ID AS DocumentID
,Document.SourceID
,Document.Name
,Document.Title
,Document.DocumentUrl
,Document.DocType
,Document.DocumentModifiedDate
,Document.Library
,DocumentMetadata.ID AS DocumentMetadataID
,DocumentMetadata.DocumentID
,DocumentMetadata.FilterID
,DocumentMetadata.Value
FROM Document
JOIN DocumentMetadata
ON DocumentMetadata.DocumentID = Document.ID
JOIN Filter
ON Filter.ID = DocumentMetadata.FilterID
WHERE
Document.Name LIKE @SearchTerms
OR Document.Title LIKE @SearchTerms
ORDER BY
Document.Name, Document.Title
END