2009-03-25 4 views
7

나는 테이블에서 검색이 SQL 쿼리를 작성 :SQL 검색 쿼리를보다 강력하게 만드는 방법은 무엇입니까?

  1. 공간 회사 :

    SELECT * FROM TableName WHERE Name LIKE '%spa%' 
    

    표는 예를 들어, 다음 행을 포함합니다.

  2. 스파 리조트.
  3. 스파 호텔.
  4. 예비 부품.
  5. 키워드 없음.

는 나는 다음과 같이 정렬 된 결과를 반환 할 수 있도록이 쿼리를 편집하는 방법을 알고 싶어

2 Spa resort

3 Spa hotel

1 Space Company

4 Spare Parts

이 먼저 등 사람을 정확한 단어를 포함하는 항목을 의미합니다. 다음은 필요한을해야 다음

Select * from TableName where Name Like '%spa%' 
ORDER BY Name 

답변

10

뭔가 확인을 작동합니다.

실제로이 더

Select * from TableName where Name Like 'Spa%' 
ORDER BY DIFFERENCE(name, 'Spa') desc; 

FWIW를 작동 나는 몇 가지 빠른 검사를했고 '이름'인덱스를 사용하는 클러스터되지 않은 인덱스 SQL에 있으며 테이블 스캔을하지 않는 경우. 또한, LIKE는 charindex보다 적은 리소스를 사용하는 것 같습니다 (이는 덜 바람직한 결과를 반환 함). SQL 2000에서 테스트되었습니다.

+0

당신은 "soundex (name) = soundex ('Spa')"라고 쓰고 soundex (name)는 무엇과 같은 이름일까요? –

+0

"Name"은 작성한 첫 번째 스크립트의 필드 이름이 –

+0

이고, 항상 다음과 같은 오류가 표시됩니다. "varchar 값 'L000'을 데이터 유형 int로 변환 할 때 변환이 실패했습니다." –

-1

이 작동합니다. FullText 인덱싱이 도움이 될 것이라고 생각하지만, 그 자체로 오버 헤드가 있습니다.

Select * from TableName where Name Like 'Spa%' 
ORDER BY case when soundex(name) = soundex('Spa') then '1' else soundex(name) end 

같은

select distinct * from 
(
Select * from TableName 
    where CHARINDEX('spa ', Name) > 0 
    or CHARINDEX(' spa', Name) > 0 
Union 
Select * from TableName 
    where Name Like '%spa%' 
) 
+0

문제는 그가 매치의 품질에 따라 분류하기를 원합니다. 이름으로 명령하면 원하는대로 할 수 없습니다. –

1

하지만이 전체 테이블 선택을하고, 비효율적이고 또한 공백으로 구분되는 사용자의 일치에 의존 :

5

당신의 스키마는 이러한 종류의 쿼리에 대한 인덱스의 유용성을 거의 제거한다고 생각합니다.

큰 문제는 'LIKE'% spa % ' "입니다. 와일드 카드로 시작하는 "LIKE"키는 자동 테이블 스캔입니다.


편집 : 내가 단어 뒤에 번호 등 "1 우주 회사"와 같은 필드 값 뭔가 "2 스파 리조트"로, 이름 하나의 필드가 말을 질문을 읽어 보시기 바랍니다. 숫자 부분을지나 가기 위해 검색 키 앞에 와일드 카드가 필요했습니다. (이것은 나의 첫번째 코멘트를 명확히하기위한 것이다.) 나는 정확하게 추측하고 있냐 그렇지 않느냐?

+0

무엇을 의미합니까? –

+0

"1 Space Company"의 필드 값 하나? 왜이 두 분야가 "1"과 "우주 회사"가 아닌가? 이름 부분에만 색인을 생성하는 것은 불가능하며, 실제로는 두 개의 다른 데이터 요소이거나 일부 필드에 대한 정렬을 묻지 ​​않을 것입니다. – dkretz

+0

큰 문제는 "LIKE '% spa %'"입니다. 와일드 카드로 시작하는 "LIKE"키는 자동 테이블 스캔입니다. – dkretz

1

적어도 MSSQL2005에서는 CLUSTERED를 NONCLUSTERED로 변경하면 테이블 스캔을 수행 할 것입니다. CLUSTERED는 색인 탐색을 제공합니다. 질문의 조건과 일치하는 것 같습니다.

 
CREATE TABLE tblTest(ID INT, colname VARCHAR(20)) 
CREATE CLUSTERED INDEX tstidx1_tblTest ON tblTest(colname); 
INSERT tblTest SELECT 1,'Space Company' 
INSERT tblTest SELECT 2,'Spa Resort' 
INSERT tblTest SELECT 3,'Spa Hotel' 
INSERT tblTest SELECT 4,'Spare Parts' 
INSERT tblTest SELECT 5,'WithoutTheKeyword' 

SELECT * FROM tblTest WHERE colname LIKE 'Spa%' 
ORDER BY DIFFERENCE(colname,'Spa') DESC; 

DROP TABLE tblTest 
1

기본적으로 순위 기능이 실제로 무엇인지 (정확하게) 정의해야합니다. "The Spa"행을 가지고 있다면 어떨까요? 또는 "spa.com"입니까? 정의한 후에는 논리를 ORDER BY 절에 넣어야합니다.예를 들어 : 또는

SELECT 
    name 
FROM 
    Some_Table 
WHERE 
    name LIKE '%spa%' 
ORDER BY 
    CASE 
     WHEN name LIKE '% ' + @search_word + ' %' THEN 1 -- Notice the spaces 
     ELSE 2 
    END, 
    name 

, 당신은 순위 함수를 작성하고 사용할 수 있습니다 너무 큰되지 않을 수 있습니다 매우 큰 결과 집합에

SELECT 
    name 
FROM 
    Some_Table 
WHERE 
    name LIKE '%' + @search_word + '%' 
ORDER BY 
    dbo.GetNameMatchRank(name, @search_word) 

성능, 그래서이 방법은 예상 검색 결과에 따라 달라집니다 크기.

관련 문제