TSQL: запрос с необязательным объединением - PullRequest
3 голосов
/ 25 февраля 2010

У меня есть пользовательский интерфейс поиска с 3 дополнительными критериями поиска. 2 из них являются простыми критериями для утверждения where, которое я должен решить с помощью этого: Хранимая процедура с необязательными параметрами "WHERE" .

Последний критерий использует полнотекстовый поиск, где я присоединяюсь к результату из ContainsTable. Есть ли какая-то хитрость, которую я могу использовать, чтобы поместить все в одну хранимую процедуру? Или я должен сделать два запроса, один с полнотекстовым поиском, а другой без?

Отредактировано: я должен был также поставить свой запрос здесь, извините, здесь он

select Table1.* from Table1
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 Table1.Id = r.[Key]

where ( @Status_Id Is Null Or Status_Id = @Status_Id )

order by r.Rank Desc

Спасибо.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2010

вы можете поместить все в одну хранимую процедуру и получить оператор IF - http://msdn.microsoft.com/en-us/library/ms182717.aspx

2 голосов
/ 25 февраля 2010

Оригинальный ответ:

Вы можете использовать функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...