sql >> データベース >  >> RDS >> Sqlserver

キーワードに一致するSQLクエリ?

    はい、全文検索で可能であり、おそらく最良の答えです。ストレートT-SQLソリューションの場合、分割関数と結合を使用できます。 dbo.Numbersと呼ばれる数値のテーブルを想定します(別の上限を決定する必要がある場合があります):

    SET NOCOUNT ON;
    DECLARE @UpperLimit INT;
    SET @UpperLimit = 200000;
    
    WITH n AS
    (
        SELECT
            rn = ROW_NUMBER() OVER
            (ORDER BY s1.[object_id])
        FROM sys.objects AS s1
        CROSS JOIN sys.objects AS s2
        CROSS JOIN sys.objects AS s3
    )
    SELECT [Number] = rn - 1
    INTO dbo.Numbers
    FROM n
    WHERE rn <= @UpperLimit + 1;
    
    CREATE UNIQUE CLUSTERED INDEX n ON dbo.Numbers([Number]);
    

    そして、その数値の表を使用する分割関数:

    CREATE FUNCTION dbo.SplitStrings
    (
        @List NVARCHAR(MAX)
    )
    RETURNS TABLE
    AS
        RETURN
        (
            SELECT DISTINCT
                [Value] = LTRIM(RTRIM(
                    SUBSTRING(@List, [Number],
                    CHARINDEX(N',', @List + N',', [Number]) - [Number])))
            FROM
                dbo.Numbers
            WHERE
                Number <= LEN(@List)
                AND SUBSTRING(N',' + @List, [Number], 1) = N','
        );
    GO
    

    次に、次のように簡単に言うことができます:

    SELECT key, NvarcharColumn /*, other cols */
    FROM dbo.table AS outerT
    WHERE EXISTS
    (
      SELECT 1 
        FROM dbo.table AS t 
        INNER JOIN dbo.SplitStrings(N'list,of,words') AS s
        ON t.NvarcharColumn LIKE '%' + s.Item + '%'
        WHERE t.key = outerT.key
    );
    

    手順として:

    CREATE PROCEDURE dbo.Search
        @List NVARCHAR(MAX)
    AS
    BEGIN
        SET NOCOUNT ON;
    
        SELECT key, NvarcharColumn /*, other cols */
        FROM dbo.table AS outerT
        WHERE EXISTS
        (
          SELECT 1 
            FROM dbo.table AS t 
            INNER JOIN dbo.SplitStrings(@List) AS s
            ON t.NvarcharColumn LIKE '%' + s.Item + '%'
            WHERE t.key = outerT.key
        );
    END
    GO
    

    次に、@Listを渡すだけです。 (例:EXEC dbo.Search @List = N'foo,bar,splunge' )C#から。

    これは超高速ではありませんが、すべてのデータをC#に取り出して、手動でダブルネストループするよりも高速になると確信しています。



    1. MySQL/PHP同じ行を2回挿入する

    2. mysql LOAD DATA / mysqlimportのパフォーマンスを改善しますか?

    3. 2つの行を組み合わせて、MySQLの2つのタイムスタンプ値間の時間差を計算するにはどうすればよいですか?

    4. ジョイントテーブルで仕様とCriteriaQueryを使用するSpringJPA