다음을 통해 공유


CONTAINS(Transact-SQL)

업데이트: 2006년 4월 14일

문자 기반 데이터 형식이 포함된 열에서 특정 단어나 구와 정확히 일치하거나 비슷하게 일치하는 단어를 검색하거나, 서로 근접한 단어 검색, 가중치 검색에 사용되는 조건자입니다.

SQL Server 2005에서는 CONTAINS 또는 FREETEXT 전체 텍스트 조건자에 4부분으로 된 이름을 사용하여 연결된 서버에 대한 쿼리를 실행할 수 있습니다.

CONTAINS는 다음을 검색할 수 있습니다.

  • 단어나 구
  • 단어나 구의 접두사
  • 다른 단어에 근접한 단어
  • 다른 단어에서 어미를 변화하여 생성된 단어(예: drive라는 단어는 drives, drove, driving, driven의 어간임)
  • 동의어 사전을 사용하는 다른 단어의 동의어(예: metal이라는 단어에는 aluminum 및 steel 같은 동의어가 있을 수 있음)

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

CONTAINS
      ( { column_name | (column_list) | * } 
          , '< contains_search_condition >'     
   [ , LANGUAGE language_term ]
      ) 
< contains_search_condition > ::= 
    { < simple_term > 
    | < prefix_term > 
    | < generation_term > 
    | < proximity_term > 
    | < weighted_term > 
    } 
    | { ( < contains_search_condition > ) 
    [ { < AND > | < AND NOT > | < OR > } ] 
    < contains_search_condition > [ ...n ] 
    } 
< simple_term > ::= 
          word | " phrase "
< prefix term > ::= 
     { "word * " | "phrase *" }
< generation_term > ::= 
     FORMSOF ( { INFLECTIONAL | THESAURUS } , < simple_term > [ ,...n ] ) 
< proximity_term > ::= 
     { < simple_term > | < prefix_term > } 
     { { NEAR | ~ }
     { < simple_term > | < prefix_term > } 
     } [ ...n ] 
< weighted_term > ::= 
     ISABOUT 
        ( { { 
  < simple_term > 
  | < prefix_term > 
  | < generation_term > 
  | < proximity_term > 
  } 
   [ WEIGHT ( weight_value ) ] 
   } [ ,...n ] 
        ) 
< AND > ::= 
     { AND | & }
< AND NOT > ::= 
     { AND NOT | & !}
< OR > ::= 
     { OR | | }

인수

  • column_name
    전체 텍스트 인덱스에 포함된 열 이름입니다. char, varchar, nchar, nvarchar, text, ntext, image, xmlvarbinary(max) 유형의 열은 전체 텍스트 검색에 사용할 수 있습니다.
  • column_list
    여러 개의 열을 쉼표로 구분하여 지정할 수 있음을 나타냅니다. column_list는 괄호로 묶어야 합니다. language_term을 지정하지 않을 경우 column_list에 있는 모든 열의 언어가 같아야 합니다.
  • *
    전체 텍스트 검색을 위해 등록된 테이블의 모든 열을 지정한 포함 검색 조건을 검색하는 데 사용하도록 지정합니다. CONTAINS 절의 열은 단일 테이블에서 가져와야 합니다. FROM 절에 두 개 이상의 테이블이 있을 경우 테이블 이름에 *를 지정해야 합니다. language_term을 지정하지 않을 경우 테이블에 있는 모든 열의 언어가 같아야 합니다.
  • LANGUAGE language_term
    사용자가 쿼리를 실행하고 있는 언어입니다. 열에 BLOB(Binary Large Object)으로 저장된 여러 문서가 있는 경우 실제 문서 내용을 인덱싱하는 데 사용되는 언어는 문서의 LCID(로캘 ID)에 의해 결정됩니다. 따라서 단일 열에 여러 언어를 저장할 수 있습니다. LANGUAGE 매개 변수를 사용하면 검색할 언어를 지정할 수 있으므로 검색 확률을 높일 수 있습니다.

    이 매개 변수는 옵션이며 언어의 LCID에 해당하는 문자열, 정수 또는 16진수 값으로 지정할 수 있습니다. language_term을 지정할 경우 해당 언어는 검색 조건의 모든 요소에 적용됩니다. 값이 지정되지 않은 경우 전체 텍스트 언어 열이 사용됩니다.

    문자열로 지정하는 경우 language_termsyslanguages 시스템 테이블의 alias 열 값에 해당합니다. 문자열은 'language_term'과 같이 작은따옴표로 묶어야 합니다. 정수로 지정하는 경우 language_term은 언어를 식별하는 실제 LCID입니다. 16진수 값으로 지정하는 경우 language_term은 0x로 시작하는 LCID의 16진수 값입니다. 16진수 값은 선행 0을 포함하여 8자리 수를 초과할 수 없습니다.

    값이 DBCS(더블바이트 문자 집합) 형식인 경우 SQL Server는 값을 유니코드로 변환합니다.

    지정된 언어가 잘못되었거나 해당 언어에 해당하는 리소스가 설치되지 않은 경우 SQL Server는 오류를 반환합니다. 언어 중립적인 리소스를 사용하려면 language_term을 0x0으로 지정하십시오.

  • <contains_search_condition>
    column_name에서 검색할 텍스트와 일치 조건을 지정합니다.

    contains_search_conditionnvarchar입니다. 암시적 변환은 다른 문자 데이터 형식이 입력으로 사용될 때 발생합니다. 다음 예에서는 varchar(30)로 정의된 @SearchWord 변수로 인해 CONTAINS 조건자에서 암시적 변환이 발생합니다.

    USE AdventureWorks;
    GO
    DECLARE @SearchWord varchar(30)
    SET @SearchWord ='performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE CONTAINS(Description, @SearchWord);
    

    변환 시 "매개 변수 스니핑"이 작동하지 않으므로 성능을 향상시키려면 nvarchar를 사용합니다. 이 예에서는 @SearchWord를 **nvarchar(30)**로 선언합니다.

    USE AdventureWorks;
    GO
    DECLARE @SearchWord nvarchar(30)
    SET @SearchWord = N'performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE CONTAINS(Description, @SearchWord);
    

    최적화되지 않은 계획이 생성되는 경우 OPTIMIZE FOR 쿼리 힌트를 사용할 수도 있습니다.

  • word
    공백이나 문장 부호가 포함되지 않은 문자열입니다.
  • phrase
    각 단어 사이에 공백이 포함된 하나 이상의 단어입니다.

    [!참고] 일부 아시아 지역의 언어로 작성된 경우처럼 어떤 언어에는 각 단어 사이에 공백이 없는 하나 이상의 단어로 구성된 구가 있을 수 있습니다.

  • <simple_term>
    정확하게 단어나 구가 일치하는 항목을 지정합니다. 유효한 단순 용어의 예로는 "blue berry", blueberry, "Microsoft SQL Server" 등이 있습니다. 구는 큰따옴표("")로 묶어야 합니다. 구에 포함된 단어는 <contains_search_condition>에 지정된 것과 같은 순서로 데이터베이스 열에 나타나야 합니다. 단어나 구의 문자 검색은 대/소문자를 구분하지 않습니다. 전체 텍스트 인덱싱된 열에서 의미 없는 단어(예: a, and, the 등)는 전체 텍스트 인덱스에 저장되지 않습니다. 단일 단어 검색에서 의미 없는 단어가 사용되는 경우 SQL Server는 쿼리에 의미 없는 단어만 포함되어 있다는 오류 메시지를 반환합니다. SQL Server에는 각 SQL Server 인스턴스의 \Mssql\Binn\FTERef 디렉터리에 의미 없는 단어의 표준 목록이 포함되어 있습니다.

    문장 부호는 무시됩니다. 따라서 CONTAINS(testing, "computer failure")는 "Where is my computer? Failure to find it would be expensive."라는 값을 가진 행을 검색합니다. 단어 분리기 기능에 대한 자세한 내용은 단어 분리기 및 형태소 분석기를 참조하십시오.

  • <prefix_term>
    지정한 텍스트로 시작하는 단어나 구를 검색하도록 지정합니다. 접두사 용어를 큰따옴표("")로 묶고 뒤에 있는 따옴표 앞에 별표(*)를 추가하여 별표 앞에 지정된 단순 용어로 시작하는 일치하는 모든 텍스트를 찾으십시오. 절은 CONTAINS (column, '"text*"')와 같이 지정해야 합니다. 별표는 단어나 구에 포함된 어근의 문자 개수에 관계없이 검색합니다. 텍스트와 별표가 큰따옴표로 구분되지 않은 경우 조건자는 CONTAINS (column, 'text*')를 읽고 전체 텍스트 검색은 별표를 문자로 간주하여 text*와 정확하게 일치하는 텍스트를 검색합니다. 일반적으로 단어 분리기는 별표(*) 문자가 있는 단어를 무시하므로 전체 텍스트 엔진은 이러한 단어를 검색하지 않습니다.

    <prefix_term>이 구일 경우 구에 포함된 각 단어는 별도의 접두사로 간주됩니다. 따라서 "local wine *"의 접두사를 지정하는 쿼리는 "local winery", "locally wined and dined" 등의 텍스트가 포함된 모든 행을 검색합니다.

  • <generation_term>
    여기에 포함된 원래 단순 용어에서 파생된 단어를 검색하도록 지정합니다.
  • INFLECTIONAL
    지정된 단순 용어에 언어별 형태소 분석기를 사용하도록 지정합니다. 형태소 분석기 동작은 각 언어의 형태소 분석 규칙에 따라 정의됩니다. 중립 언어에는 관련 형태소 분석기가 없습니다. 쿼리할 열의 열 언어는 원하는 형태소 분석기를 참조하는 데 사용됩니다. language_term을 지정하면 해당 언어에 대한 형태소 분석기가 사용됩니다.

    <generation_term> 내에 지정된 <simple_term>은 명사와 동사 중 하나만 검색합니다.

  • THESAURUS
    전체 텍스트 언어 열 또는 쿼리에 지정된 언어에 해당되는 동의어 사전이 사용되도록 지정합니다. simple_term에서 가장 긴 패턴에 대해 동의어 사전에서 대응되는 단어를 찾고 원래 패턴을 확장하거나 대체하도록 추가 용어가 생성됩니다. simple_term의 전체 또는 일부에 일치하는 항목을 찾을 수 없으면 일치하지 않는 부분이 simple_term으로 처리됩니다. 전체 텍스트 검색 동의어 사전에 대한 자세한 내용은 사전을 참조하십시오.
  • <proximity_term>
    서로 근접하게 일치하는 단어나 구를 지정합니다. <proximity_term>은 검색할 열에 둘 이상의 단어나 구가 포함되어야 한다는 점에서 AND 연산자와 비슷합니다. <proximity_term>에 포함된 단어가 서로 가까울수록 더 많이 일치하는 것입니다.

    • NEAR | ~
      NEAR 또는 ~ 연산자의 왼쪽에 있는 단어나 구가 NEAR 또는 ~ 연산자의 오른쪽에 있는 단어나 구와 근접해 있음을 나타냅니다. 다음과 같이 근접한 단어를 여러 개 지정할 수도 있습니다.

      a NEAR b NEAR c 
      

      즉, a라는 단어나 구가 b라는 단어나 구에 근접해 있고 이 b라는 단어나 구는 c라는 단어나 구에 인접해야 한다는 의미입니다. 여러 개의 근접한 단어가 연결되어 있으면 모든 근접한 단어는 서로 근접해 있어야 합니다. 따라서 a ~ b ~ c 예에서 a라는 단어나 구는 c라는 단어나 구에 근접해 있어야 합니다.

  • <weighted_term>
    쿼리에서 반환된 결과 행이 단어 및 구 목록과 일치하고 선택적으로 가중치 값이 지정되도록 합니다.
  • ISABOUT
    <weighted_term> 키워드를 지정합니다.

    • WEIGHT(weight_value)
      0.0에서 1.0 사이의 숫자로 가중치 값을 지정합니다. <weighted_term>의 각 구성 요소는 weight_value를 포함할 수 있습니다. weight_value를 사용하여 쿼리의 각 부분이 쿼리와 일치하는 각 행에 할당되는 등급 값에 영향을 주는 방법을 변경할 수 있습니다. WEIGHT는 CONTAINS 쿼리 결과에 영향을 주지 않지만 WEIGHT는 CONTAINSTABLE 쿼리의 순위에 영향을 줍니다. 자세한 내용은 CONTAINSTABLE(Transact-SQL)을 참조하십시오.

      [!참고] 운영 체제 로캘에 관계없이 소수 구분 기호는 항상 마침표입니다.

  • { AND | & } | { AND NOT | &! } | { OR | | }
    두 개의 포함 검색 조건 간에 논리적 연산을 지정합니다.

    • AND | &
      두 개의 포함 검색 조건이 모두 충족되어야 일치합니다. AND 키워드 대신 앰퍼샌드 기호(&)를 사용하여 AND 연산자를 나타낼 수 있습니다.
    • AND NOT | &!
      두 번째 검색 조건이 일치하지 않아야 한다는 의미입니다. AND NOT 키워드 대신 앰퍼샌드 다음에 느낌표 기호(&!)를 사용하여 AND NOT 연산자를 나타낼 수 있습니다.
    • OR | |
      두 개의 포함 검색 조건 중 하나가 충족되어야 일치합니다. OR 키워드 대신 막대 기호(|)를 사용하여 OR 연산자를 나타낼 수 있습니다.

      <contains_search_condition>에 괄호로 묶은 그룹이 포함되면 이 괄호로 묶은 그룹이 먼저 평가됩니다. 괄호로 묶인 그룹을 평가한 후 포함 검색 조건에 논리 연산자를 사용할 때 다음 규칙이 적용됩니다.

      • AND보다 NOT이 먼저 적용됩니다.
      • NOT은 AND 다음에만 올 수 있으며(예: AND NOT) OR NOT 연산자는 허용되지 않습니다. NOT은 첫 번째 단어 앞에 지정할 수 없습니다. 예를 들어 CONTAINS (mycolumn, 'NOT "phrase_to_search_for" ' )는 유효하지 않습니다.
      • OR보다 AND가 먼저 적용됩니다.
      • 동일한 유형의 부울 연산자(AND, OR)는 결합성을 가지므로 어떤 순서로든 적용할 수 있습니다.
      • n
        여러 포함 검색 조건과 용어를 지정할 수 있음을 나타내는 자리 표시자입니다.

주의

호환성 수준이 70보다 낮은 경우 CONTAINS는 키워드로 인식되지 않습니다. 자세한 내용은 sp_dbcmptlevel(Transact-SQL)을 참조하십시오.

1. <simple_term>에 CONTAINS 사용

다음 예에서는 가격이 $80.99이고 "Mountain"이라는 단어가 포함된 모든 제품을 검색합니다.

USE AdventureWorks;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
   AND CONTAINS(Name, 'Mountain');
GO

2. <simple_term>에 CONTAINS와 구 사용

다음 예에서는 "Mountain"이나 "Road"라는 구가 포함된 모든 제품을 반환합니다.

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Mountain" OR "Road" ')
GO

3. <prefix_term>에 CONTAINS 사용

다음 예에서는 Name 열에 접두사 chain으로 시작하는 단어가 하나 이상인 모든 제품 이름을 반환합니다.

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
GO

4. <prefix_term>에 CONTAINS와 OR 사용

다음 예에서는 접두사가 "chain" 또는 "full"인 문자열을 포함하는 모든 범주 설명을 반환합니다.

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, '"chain*" OR "full*"');
GO

5. <proximity_term>에 CONTAINS 사용

다음 예에서는 bikeperformance라는 단어가 서로 근접해 있는 제품 이름을 모두 반환합니다.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'bike NEAR performance');
GO

6. <generation_term>에 CONTAINS 사용

다음 예에서는 riding, ridden 등 ride에서 파생된 단어가 있는 모든 제품을 검색합니다.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ');
GO

7. <weighted_term>에 CONTAINS 사용

다음 예에서는 performance, comfortable 또는 smooth 단어가 포함된 모든 제품 이름을 검색하며 각 단어에는 다른 가중치가 지정됩니다.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'ISABOUT (performance weight (.8), 
comfortable weight (.4), smooth weight (.2) )' );
GO

8. 변수에 CONTAINS 사용

다음 예에서는 특정 검색 단어 대신에 변수를 사용합니다.

USE AdventureWorks;
GO
DECLARE @SearchWord nvarchar(30)
SET @SearchWord = N'Performance'
SELECT Description 
FROM Production.ProductDescription 
WHERE CONTAINS(Description, @SearchWord);
GO

참고 항목

참조

CONTAINSTABLE(Transact-SQL)
FREETEXT(Transact-SQL)
FREETEXTTABLE(Transact-SQL)
WHERE(Transact-SQL)

관련 자료

전체 텍스트 검색
전체 텍스트 검색 쿼리

도움말 및 정보

SQL Server 2005 지원 받기

변경 내역

릴리스 내역

2006년 4월 14일

새로운 내용
  • contains_search_condition을 사용한 변환 방지에 대한 정보를 추가했습니다.

2007년 9월 15일

새로운 내용
  • ISABOUT 정의에 소수 구분 기호에 대한 참고를 추가했습니다.