2017-08-29 6 views
0

ユーザーが入力する検索語句にはTextBoxの1つのフォームがあり、結果はListBoxに表示されます。TextBoxに入力された複数のキーワードを使用してSQLデータベースを検索します

すべての検索語句を入力して、入力した順序に関係なく単語を使用してSQL検索を実行することは可能です。

単語を分割し、個々の検索語句としてSELECTコマンドに渡す正しい構文がわからないだけです。

私が現在持っていることは以下の通りです:

If txtDescription.Text <> "" Then 
    SQL.AddParam("@Description", "%" & txtDescription.Text & "%") 
    SQL.ExecQuery("SELECT Description FROM PartsList WHERE Description LIKE @Description ORDER BY ID ASC;") 

    For Each x As DataRow In SQL.DBDT.Rows 
     lbPartsList.Items.Add(x("Description")) 
    Next 
End If 

FOR文は、それぞれの行を処理し、ユーザに表示するためListBoxに追加します。

私はこの点で大きな助けになります。

私は解決策を探しましたが、そのほとんどは他の言語に関連していますが、それについてはあまり知識がありません。

+0

それぞれの用語をテストするために、より複雑なクエリが必要になると思います。 – Plutonix

+0

検索条件を分割してループし、 'where desc like 'test1'やdesc 'test2''などのwhere節でそれらを一緒に文字列にするか、ループを使用してそれぞれに複数のselect文を連結する必要があります検索用語を使用し、 'select * from pl 'のような" union "を使用します。上記の最初のオプションはデータベースにとってはより効率的ですが、where句を正しく構築するには少しの作業が必要になります – soohoonigan

答えて

0

私はテーブルに文字で区切られた文字列のリストを分割するには、SQLサーバー上の関数を作成することから始めます:あなたはこの機能を持っていたら、それは、ストアドプロシージャを作成するために風になり、

CREATE Function [dbo].[StringListToNVarcharTable] 
(@List nvarchar(MAX), @Splitter char(1)) 
    RETURNS @tbl TABLE ([value] nvarchar(MAX) NOT NULL) AS 
BEGIN 

    IF @Splitter IS NULL 
     SET @Splitter = ',' 

    DECLARE @pos  int, 
      @nextpos int, 
      @valuelen int 

    SELECT @pos = 0, @nextpos = 1 

    WHILE @nextpos > 0 
     BEGIN 
      SELECT @nextpos = charindex(@Splitter, @list, @pos + 1) 
      SELECT @valuelen = CASE WHEN @nextpos > 0 
            THEN @nextpos 
            ELSE len(@list) + 1 
          END - @pos - 1 
      INSERT @tbl ([value]) 
      VALUES (convert(nvarchar(MAX), substring(@list, @pos + 1, @valuelen))) 
      SELECT @pos = @nextpos 
     END 
    RETURN 
END 
GO 

は上さらに移動この関数を使ってあなたの検索を行うことができます - 私は個人的にパイプで区切られた文字列を好みますが、好きなものを選ぶことができます。

CREATE PROCEDURE GetPartDescription 
@PipeDelimitedSearchString VARCHAR(MAX) 
AS 
BEGIN 
    DECLARE @TblSearchStrings TABLE ([value] NVARCHAR(MAX) NOT NULL) 

    IF (@PipeDelimitedSearchString IS NOT NULL AND LEN(@PipeDelimitedSearchString) > 0) 
    BEGIN 
     INSERT INTO @TblSearchStrings ([value]) 
     SELECT [value] 
     FROM StringListToNVarcharTable(@PipeDelimitedSearchString, '|') 
    END 

    SELECT 
     pl.PartId, 
     pl.PartName, 
     pl.PartDescription 
    FROM PartsList pl 
    INNER JOIN @TblSearchStrings ts ON pl.[Description] LIKE ('%' + ts.[value] + '%') 
    GROUP BY 
     pl.PartId, 
     pl.PartName, 
     pl.PartDescription 
    ORDER BY 
     pl.PartId, 
     pl.PartName, 
     pl.PartDescription 
END 

現在、コードからストアドプロシージャを呼び出す方法があります。 このコードはテストしていませんが、その要点はわかります。あなたは再利用可能な関数と再利用可能なspを持っており、あなたのコードでハードコードされたSQLクエリを取り除いています。

関連する問題