0

1つまたは2つのデータベース(nvarchar)列(REMARKSおよびSUPPLEMENTAL_REMARKS)に対してクエリを実行するキーワードの行が0から多数の1つの列を持つテーブル値パラメーター(@KEYWORD)があります。超シンプルなコンセプト。

私が問題を抱えているのは、SQLを記述して、その1つ(または2つ)のデータベース列に対して提供された個々のキーワードのそれぞれをチェックする方法です。

これがWHERE句の未完成部分です...

WHERE
(
    CASE WHEN EXISTS (SELECT 1 FROM @KEYWORD) THEN
        --check that some combination of either REMARKS or SUPPLEMENTAL_REMARKS contains all supplied values
        CASE WHEN (
        --  RES.REMARKS (or RES.SUPPLEMENTAL_REMARKS) LIKE %keyword[0]%
        --  AND
        --  RES.REMARKS (or RES.SUPPLEMENTAL_REMARKS) LIKE %keyword[1]%
        --  AND
        --  ... (this doesn't work for many reasons, but is just to give an idea)
        ) THEN
            1
        ELSE
            0
        END
    ELSE --TVP (@KEYWORD) not supplied, so ignore this filter
        1
    END
) = 1
4

2 に答える 2

1

JOINは使えますか?次に、DISTINCTをソーステーブルだけに戻します。これにより、複数のキーワードに一致したときに複数の行が取得されることはありません。

select distinct res.*
from sourcetable res 
join @keywords kw on res.REMARKS like '%'+kw.keyword+'%' or res.SUPPLEMENTAL_REMARKS like '%'+kw.keyword+'%'

すべてを一致させる必要があり、キーワードが空のときにすべてのソース行を表示する場合

select res.id, res.REMARKS, res.SUPPLEMENTAL_REMARKS from (
  select res.id, res.REMARKS, res.SUPPLEMENTAL_REMARKS
  from sourcetable res
  join @keywords kw on res.REMARKS like '%'+kw.keyword+'%' or res.SUPPLEMENTAL_REMARKS like '%'+kw.keyword+'%'
  group by res.id, res.REMARKS, res.SUPPLEMENTAL_REMARKS
  having count(*) = (select count(*) from @keywords)
) k1 UNION ALL SELECT res.id, res.REMARKS, res.SUPPLEMENTAL_REMARKS FROM (
  SELECT * WHERE 0=(select count(*) from @keywords)
) k0
于 2013-01-08T23:30:17.523 に答える
1

以下のSQLコメントに基づいて、REMARKSまたはSUPPLEMENTAL_REMARKSのいずれかですべてのキーワードが一致するresからのレコードのみが必要です。

 --  REMARKS (or SUPPLEMENTAL_REMARKS) LIKE %keyword[0]%
        --  AND
        --  REMARKS (or SUPPLEMENTAL_REMARKS) LIKE %keyword[1]%
        --  AND
        --  ... (this doesn't work for many reasons, but is just to give an idea)

これを行う最も簡単な方法は、参加してカウントを行い、@KEYWORDのキーワードの数と一致することを確認することです。

DECLARE @KEYWORDCOUNT as INT
SELECT @KEYWORDCOUNT = COUNT(*) FROM @Keyword

SELECT ID, [REMARKS], [SUPPLEMENTAL_REMARKS]
FROM 
  res r
  INNER JOIN @Keyword k
  ON r.REMARKS like '%' + k.keyword + '%'
     OR r.SUPPLEMENTAL_REMARKS like '%' + k.keyword + '%'


GROUP BY 
  ID,[REMARKS], [SUPPLEMENTAL_REMARKS]
HAVING COUNT(ID) = @KEYWORDCOUNT

あなたの場所へのそれのための1つの方法はそうです

WHERE
  @KEYWORDCOUNT = 0 
  OR 
  res.id in (SELECT ID
            FROM 
                res r
                INNER JOIN @Keyword k
               ON r.REMARKS like '%' + k.keyword + '%'
                 OR r.SUPPLEMENTAL_REMARKS like '%' + k.keyword + '%'
             GROUP BY 
              ID
             HAVING COUNT(ID) = @KEYWORDCOUNT)

DataTable.Rows.Countはほとんど無料なので、@KEYWORDCOUNTをパラメーターとして渡すことを検討することをお勧めします

デモ

于 2013-01-08T23:38:23.687 に答える