Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kueri SQL untuk mencocokkan kata kunci?

Ya, mungkin dengan pencarian teks lengkap, dan kemungkinan jawaban terbaik. Untuk solusi T-SQL langsung, Anda dapat menggunakan fungsi split dan bergabung, mis. dengan asumsi tabel angka yang disebut dbo.Numbers (Anda mungkin perlu memutuskan batas atas yang berbeda):

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]);

Dan fungsi pemisahan yang menggunakan tabel angka tersebut:

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

Kemudian Anda cukup mengatakan:

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
);

Sebagai prosedur:

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

Kemudian Anda bisa memasukkan @List (mis. EXEC dbo.Search @List = N'foo,bar,splunge' ) dari C#.

Ini tidak akan super cepat, tapi saya yakin ini akan lebih cepat daripada menarik semua data ke C# dan menggandakannya secara manual.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kueri hierarkis di SQL Server 2005

  2. Mengapa kita selalu lebih suka menggunakan parameter dalam pernyataan SQL?

  3. Kesalahan SSMS 2016 Mengimpor Azure SQL v12 bacpac:kunci master tanpa kata sandi tidak didukung

  4. Pencarian teks lengkap diinstal atau tidak

  5. konversi tipe data varchar ke tipe data datetime menghasilkan nilai di luar rentang