Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truy vấn SQL để đối sánh từ khóa?

Có, có thể với tìm kiếm toàn văn và có thể là câu trả lời tốt nhất. Đối với giải pháp T-SQL đơn giản, bạn có thể sử dụng hàm tách và nối, ví dụ:giả sử một bảng các số được gọi là dbo.Numbers (bạn có thể cần phải quyết định một giới hạn trên khác):

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

Và một hàm tách sử dụng bảng số đó:

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

Sau đó, bạn có thể chỉ cần nói:

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

Như một thủ tục:

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

Sau đó, bạn chỉ cần nhập @List (ví dụ:EXEC dbo.Search @List = N'foo,bar,splunge' ) từ C #.

Điều này sẽ không quá nhanh, nhưng tôi chắc chắn rằng nó sẽ nhanh hơn so với việc kéo tất cả dữ liệu ra C # và lặp lại lồng ghép nó theo cách thủ công.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 10 SP_EXECUTESQL Cần tránh để có SQL động tốt hơn

  2. Xóa dấu ngoặc kép trên tất cả các hàng trong một cột

  3. Định dạng thời gian là Giờ quân sự 24 giờ?

  4. Bỏ tất cả các bảng có tên bắt đầu bằng một chuỗi nhất định

  5. Truy vấn đếm bắt buộc