Sqlserver
 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. експортиране в Excel от списък с EPPLUS

  2. Как да намерите всички таблици с колона за идентичност в базата данни на SQL Server - SQL Server / T-SQL урок, част 45

  3. Как да закръглите (НАГОРЕ/НАДОЛУ) в SQL Server – 5 полезни съвета

  4. Набор от резултати, разделени със запетая + SQL заявка

  5. Изчисляване на разстоянието между две точки (ширина, дължина)