>

테이블에 올바른 이름 목록과 자유 텍스트 필드가있는 다른 테이블이 있습니다. 해당 필드에 올바른 이름이 포함되어 있는지 확인하고 싶습니다. 그것이 하나라면, 나는 할 수있다

WHERE free_text LIKE "%proper_name%"

그러나 전체 목록에 대해 어떻게합니까? 목록과 함께 사용할 수있는 더 나은 문자열 기능이 있습니까?

감사합니다


  • 답변 # 1

    아니요, like  해당 기능이 없습니다.

    많은 데이터베이스는 정규식을 지원하므로 원하는 작업을 수행 할 수 있습니다. 예를 들어 Postgres에서는 다음과 같이 표현됩니다.

    where free_text ~ 'name1|name2|name3'
    
    

    많은 데이터베이스에는 이러한 검색 속도를 높이는 전체 텍스트 검색 기능도 있습니다.

    두 기능 모두 사용중인 데이터베이스에 따라 매우 다릅니다.

  • 답변 # 2

    자, LIKE 를 사용할 수 있습니다  표준 JOIN 에서 하지만 각 free_text 에서 각 적절한 이름을 검색하기 때문에 쿼리 속도가 느릴 것입니다. .

    예를 들어, 목록에 10 개의 적절한 이름과 특정 free_text 가있는 경우  value는 이름을 포함하고 서버는 나머지 9 개의 이름을 계속 처리합니다.

    다음은 질의입니다 :

    SELECT  -- DISTINCT
        free_text_table.*
    FROM
        free_text_table
        INNER JOIN proper_names_table ON free_text_table.free_text LIKE proper_names_table.proper_name
    ;
    
    

    특정 free_text  value에 여러 개의 적절한 이름이 포함되어 있으면 해당 행이 여러 번 리턴되므로 DISTINCT 를 추가해야 할 수도 있습니다  쿼리에. 필요한 것에 따라 다릅니다.

    <시간>

    LATERAL JOIN 를 사용할 수 있습니다  직교 곱을 피하기 위해 ( free_text_table 의 각 행   proper_names_table 의 각 행과 비교됩니다. ). 최종 변형이 간단한 변형보다 빠를 수 있습니다. 데이터 배포에 따라 다릅니다.

    다음은 SQL Server 구문입니다.

    SELECT
        free_text_table.*
    FROM
        free_text_table
        CROSS APPLY
        (
            SELECT TOP(1)
                proper_names_table.proper_name
            FROM proper_names_table
            WHERE free_text_table.free_text LIKE proper_names_table.proper_name
            -- ORDER BY proper_names_table.frequency
        ) AS A
    ;
    
    

    여기서 DISTINCT 가 필요 없습니다 , free_text_table 의 각 행에 대해 결과에 최대 하나의 행이 있습니다.  (1 또는 0). 옵티마이 저는 proper_names_table 읽기 및 처리를 중지 할 수있을 정도로 똑똑해야합니다.   TOP(1) 로 인해 첫 번째 경기가 발견되는 즉시  절.

    어떻게 든 올바른 이름을 주문하고 가장 먼저 찾을 가능성이 높은 이름을 넣을 수 있다면 쿼리가 단순한 JOIN 보다 빠를 가능성이 더 높습니다 . (적합한 ORDER BY 추가  하위 쿼리의 절).

관련 자료

  • 이전 c# - 오프라인 상태에서 내 프로그램을 방어 할 수 있습니까?
  • 다음 표준 라이브러리 및 외부 라이브러리의 Python 소스 코드보기