2017-11-13 5 views
0

UNIONステートメントを追加していますが、UNIONのIFステートメントを追加する必要がありますが、「IF '、Expecting') '、EXCEPT、またはSELECT」エラー。sql server UNIONの前にIFステートメントを使用

プロセッサの効率を向上させるために、可変文字列に特殊文字がある場合にのみUNIONを呼び出すことをお勧めします。ここに私の選択した声明があります。どんな助けもありがとうございます。ありがとう。

set @DelimitedKeyWord = (select replace(@KeyWord, '-', '')) 
set @DelimiterExists = (select CHARINDEX('-', @KeyWord)) 

select distinct top (@MaxHits) 
    results.MYID as ItemId 
    , results.Rank0 as [RANK] 
from (
    select 
     [MYID] 
    , [RANK] as Rank0 
    from [rcl].[MyTable] rm 
    inner join CONTAINSTABLE([MyTable], *, @KeyWord) as CNT 
     on CNT.[Key] = rm.RecallID 

    if (@DelimiterExists > 0) 
    begin 
     union 
     select 
      [MYID] 
     , [RANK] as Rank0 
     from [rcl].[MyTable] rm 
     inner join CONTAINSTABLE([MyTable], *, @DelimitedKeyWord) as DCNT 
     on DCNT.[Key] = rm.RecallID 
    end 
) as results 
+1

代わりにWHERE句に条件を入力します。 UNION ALLを検討してください。 – jarlh

+0

'IF'の代わりに、' WHERE @DelimiterExists> 0'を2番目の 'UNION'クエリに追加してください。 –

+0

これを達成するには、ユニオンコマンドの前に元のselectステートメントをコピーして、何も変更せずに –

答えて

0

SQLはそれほど機能しません。

SELECT DISTINCT TOP(@MaxHits) results.MYID AS ItemId, results.Rank0 AS [RANK] 
FROM ((SELECT [MYID], [RANK] AS Rank0 
     FROM [rcl].[MyTable] rm JOIN 
      CONTAINSTABLE ([MyTable], *, @KeyWord) AS CNT 
      ON CNT.[Key] = rm.RecallID 
    ) 
     UNION ALL 
     (SELECT [MYID], [RANK] AS Rank0 
     FROM [rcl].[MyTable] rm JOIN 
      CONTAINSTABLE ([MyTable], *, @DelimitedKeyWord) AS DCNT 
      ON DCNT.[Key] = rm.RecallID 
     WHERE @DelimiterExists > 0 
    ) 
    ) x; 

注:使用UNION ALL一つの方法は、WHERE句の条件を含めることです。外部クエリで既に重複を削除しています。それを2回する必要はありません。

0

これは機能しますか?

set @DelimitedKeyWord = (select replace(@KeyWord, '-', '')) 
      set @DelimiterExists = (select CHARINDEX('-', @KeyWord)) 

IF (@DelimiterExists > 0) 

    BEGIN 
     SELECT DISTINCT TOP(@MaxHits) 
        results.MYID AS ItemId, 
        results.Rank0 AS [RANK] 
        FROM 
          (
           SELECT 
             [MYID], 
             [RANK] AS Rank0 
           FROM [rcl].[MyTable] rm 
             JOIN CONTAINSTABLE ([MyTable], *, @KeyWord) AS CNT 
               ON CNT.[Key] = rm.RecallID 




           UNION ALL 

           SELECT 
             [MYID], 
             [RANK] AS Rank0 
             FROM [rcl].[MyTable] rm 

               JOIN CONTAINSTABLE ([MyTable], *, @DelimitedKeyWord) AS DCNT ON DCNT.[Key] = rm.RecallID  

           ) AS results 

    END 

ELSE 

    BEGIN 

    SELECT DISTINCT TOP(@MaxHits) 
      results.MYID AS ItemId, 
      results.Rank0 AS [RANK] 
      FROM 
        (
         SELECT 
           [MYID], 
           [RANK] AS Rank0 
         FROM [rcl].[MyTable] rm 
           JOIN CONTAINSTABLE ([MyTable], *, @KeyWord) AS CNT 
             ON CNT.[Key] = rm.RecallID 
        ) AS results 

    END 
関連する問題