Оригинальный ответ:
Вы можете использовать функцию EXISTS следующим образом:
Select ..
From ..
Where ( @Status_Id Is Null Or Status_Id = @Status_Id )
And (@Date Is Null Or [Date] = @Date )
And (@Criteria Is Null Or Exists(
Select 1
From ContainsTable(TableName, Column1,...,ColumnN, @Criteria..) As SearchTable1
Where SearchTable1.PK = OuterTable.PK
) )
После пересмотра вопроса:
Пересмотренный запрос имеет совершенно другую природу, чем исходный запрос. В исходном запросе вы просто хотели вернуть результаты из Таблицы1 и дополнительно отфильтровать эти результаты, если @Keywords не был нулевым. В этом запросе вы выводите в предложение SELECT рейтинг свободного текста. Что будет отображаться для рейтинга, если @Keywords был передан как ноль?
Если ранжирование по свободному тексту не требуется, и вы просто хотите вернуть результаты, если какой-либо из поисков по @Keywords что-то найдет, вы должны сделать что-то вроде:
Select ...
From Table1
Where ( @Status_Id Is Null Or Status_Id = @Status_Id )
And ...
And (
@Keywords Is Null
Or Exists (
Select 1
From Table1ShortSearch(@Keywords) As T1
Where T1.Key = Table1.Key
)
Or Exists (
Select 1
From Table1LongSearch(@Keywords) As T2
Where T2.Key = Table1.Key
)
)
Если вы хотите отобразить ранжирование по свободному тексту, то ваш исходный запрос или, возможно, CTE будет решением, однако вам нужно будет использовать левое соединение со своим подзапросом, если вы хотите, чтобы @Keywords был нулевым. Это сделало бы ваш запрос прочитанным:
Select ...
From Table1
Left Join (
Select [Key], Sum(Rank) as Rank
From (
Select [Key], Rank*3 As Rank
From Table1ShortSearch(@Keywords)
Union All
Select [Key], Rank*2 As Rank
From Table1LongSearch(@Keywords)
) As RankingTbl
Group By [Key]
) as R
On R.[Key] = Table1.Id
Where ( @Status_Id Is Null Or Status_Id = @Status_Id )
And ...
And ( @Keywords Is Null Or R.Key Is Not Null )
Order By R.Rank Desc