2010-03-04 23 views
5

Về cơ bản tôi có một bảng như thế này:Cách truy vấn cơ sở dữ liệu SQL Server 2008 cho họ và tên và thứ tự theo mức độ liên quan?

CREATE TABLE Person(
    PersonID int IDENTITY(1,1) NOT NULL, 
    FirstName nvarchar(512) NOT NULL, 
    LastName nvarchar(512) NULL 
) 

Và tôi cần phải tìm đầu n kết quả dựa trên một người dùng truy vấn như thế này:

"Joh Smi" 

Các truy vấn sau đây trả về kết quả Tôi cần (tôi nghĩ). Chỉ cần không theo thứ tự liên quan.

SELECT 
    PersonID, FirstName, LastName 
FROM 
    Person 
WHERE 
    FirstName LIKE 'Joh%' OR 
    LastName LIKE 'Joh%' OR 
    FirstName LIKE 'Smi%' OR 
    LastName LIKE 'Smi%' 

Nếu những tên sau đây là trong cơ sở dữ liệu và sử dụng truy vấn của chúng tôi là "Joh Smi" tên sẽ xuất hiện theo thứ tự sau (hoặc tương đương)

  1. John Smith
  2. Johnny Smith
  3. John Jacob
  4. David Smithsonian
  5. Daniel Johnson

Tôi hy vọng sẽ làm cho nó hoạt động tương tự như tìm kiếm bạn bè tự động hoàn thành của facebook.

Vì vậy, làm cách nào để trả lại các hàng n hàng có liên quan nhất trong SQL Server 2008?

Trả lời

2

là một phụ lục OMG Ngựa Non câu trả lời ...

để có được kết quả tốt nhất từ ​​một tìm kiếm văn bản đầy đủ, bạn có thể muốn cr ăn một khung nhìn được lập chỉ mục nối các trường tên và họ.

Điều này sẽ cho phép bạn cân các phần riêng biệt của tên đầy đủ chính xác hơn.

Ví dụ mã như sau:

CREATE VIEW [dbo].[vFullname] WITH SCHEMABINDING AS 
    SELECT personID, FirstName + ' ' + LastName AS name 
    FROM dbo.person 

    WITH ranks AS(
    SELECT FT_TBL.personid 
     ,FT_TBL.name 
     ,KEY_TBL.RANK 
    FROM dbo.vfullname AS FT_TBL 
     INNER JOIN CONTAINSTABLE(vfullname, (name), 
    'ISABOUT ("Smith" WEIGHT (0.4), "Smi*" WEIGHT (0.2), 
"John" WEIGHT (0.3), "Joh*" WEIGHT (0.1))') AS KEY_TBL 
      ON FT_TBL.personid = KEY_TBL.[KEY] 
    ) 
    SELECT 
    r.personID, 
    p.firstname, 
    p.lastname, 
    r.rank 
    FROM ranks r INNER JOIN 
    person p ON r.personID = p.personID 
    ORDER BY rank DESC; 

Các CTE chỉ cho phép bạn quay trở lại các lĩnh vực firstname và lastname cá nhân. Nếu bạn không cần chúng như là một đầu ra thì bỏ qua nó.

1

Trước tiên, bạn cần phải quyết định ý mình là phù hợp. Dưới đây là danh sách của tôi liên quan

  1. Cả hai từ này là chính xác đầu tiên và tên cuối cùng
  2. Tương tự như đặt hàng đầu tiên nhưng ngược
  3. Một là đầy đủ văn bản, một là substring
  4. Tương tự như 3
  5. Cả là chất nền. Bên này, bạn có thể đánh giá theo độ dài của chuỗi con (nhiều phương tiện tốt)
  6. Một là substring

Vì vậy, tôi muốn giới thiệu bạn để tạo ra chức năng đó sẽ mất FirstName và LastName và chuỗi đầu vào và trở lại int, hoặc nổi accoring để quy tắc, sau đó sắp xếp theo nó.

+0

Yêu thích danh sách. Nhưng truy vấn/hàm SQL trông như thế nào? :-) –

+0

này, đã gần 2 giờ sáng, tôi muốn ngủ :) – Andrey

+0

haha. ok ok ... Tôi sẽ cho bạn nghỉ ngơi. –

5

Tôi khuyên bạn nên thực hiện Full Text Search (FTS) vì hai lý do:

  1. Đơn giản hóa các truy vấn (không cần các ORS, which'll hoạt động kém)
  2. Sử dụng FTS cấp chức năng - xem this article
Các vấn đề liên quan