SQL SELECT creditbank. 필드에는 나치도요

데릭쉐퍼드와 select 되는 결과를 반환할 다음과 같습니다.

SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'

& # 39, 그리고 데릭쉐퍼드와 모든 결과 즉, 여기에는 함께 문장열 word2 word3 word1& # 39. # 39, & # 39, 또는 word1 word3 word2& 또는 다른 조합을 셋뿐이죠

모든 결과에 할 것이다.

해결책

하지만 이 모든 것이 느리고 apc® 단어 방법:

SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
   OR column1 LIKE '%word2%'
   OR column1 LIKE '%word3%'

, 있어야 하는 경우 모든 단어를 사용합니다.

SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
  AND column1 LIKE '%word2%'
  AND column1 LIKE '%word3%'

뭔가 스케쳐내 신속하게 수사하기 위해 필요한 전체 텍스트 검색, 이는 각 데이터베이스에 대해 매우 구체적인 유형:.

해설 (13)

단, 하위 확인하기 위해 사용하는 경우 'LIKE' 는 다른 문자열이어야 문자열으로 이스케이프입니다 합니다 패턴 일치 문자 검색에 구체화하십시오.

39 는 SQL 방언 ',' 의 경우 하리네스 it& 많이유 대신 간편하게 사용할 수 있습니다.

SELECT * FROM MyTable
WHERE CHARINDEX('word1', Column1) > 0
  AND CHARINDEX('word2', Column1) > 0
  AND CHARINDEX('word3', Column1) > 0

또한, 이 점에 유의하십시오 미디어만을 빽이라는 문자열 일치 단어 일치 방법을 수락됨 대답 대신. # 39, & # 39 word1word2word3& 계속해보게, 예를 들어, 문자열 ',' 은 여전히 match).

해설 (3)

함수

 CREATE FUNCTION [dbo].[fnSplit] ( @sep CHAR(1), @str VARCHAR(512) )
 RETURNS TABLE AS
 RETURN (
           WITH Pieces(pn, start, stop) AS (
           SELECT 1, 1, CHARINDEX(@sep, @str)
           UNION ALL
           SELECT pn + 1, stop + 1, CHARINDEX(@sep, @str, stop + 1)
           FROM Pieces
           WHERE stop > 0
      )

      SELECT
           pn AS Id,
           SUBSTRING(@str, start, CASE WHEN stop > 0 THEN stop - start ELSE 512 END) AS Data
      FROM
           Pieces
 )

쿼리하지

 DECLARE @FilterTable TABLE (Data VARCHAR(512))

 INSERT INTO @FilterTable (Data)
 SELECT DISTINCT S.Data
 FROM fnSplit(' ', 'word1 word2 word3') S -- Contains words

 SELECT DISTINCT
      T.*
 FROM
      MyTable T
      INNER JOIN @FilterTable F1 ON T.Column1 LIKE '%' + F1.Data + '%'
      LEFT JOIN @FilterTable F2 ON T.Column1 NOT LIKE '%' + F2.Data + '%'
 WHERE
      F2.Data IS NULL
해설 (3)

여기서 & # 39 에서 일부 * 대신 ',' # 39 word1 word2 word3& Column1 미터블 포함되어 있습니다. 그리고 그 사이에 다음과 같은 단어를 추가

SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 And word2 And word3'

자세한 내용은 여기 https://msdn.microsoft.com/en-us/library/ms187787.aspx

  • 업데이트 *

다음과 같은 문구를 선택용 큰따옴표 사용

SELECT * FROM MyTable WHERE Column1 CONTAINS '"Phrase one" And word2 And "Phrase Two"'
해설 (0)
SELECT * FROM MyTable WHERE 
Column1 LIKE '%word1%'
AND Column1 LIKE '%word2%'
AND Column1 LIKE  '%word3%'

변경일 '또는' 편집 '와' 를 기반으로 질문이예요

해설 (1)

모든 단어 하는 경우

SELECT * FROM MyTable WHERE CONTAINS(Column1,'word1 and word2 and word3', 1) > 0

단어의 필요한 경우

SELECT * FROM MyTable WHERE CONTAINS(Column1,'word1 or word2 or word3', 1) > 0
    • 컨텍스트로 유형에 따라 색인입니다 열 필요가 있습니다.
CREATE INDEX SEARCH_IDX ON MyTable(Column) INDEXTYPE IS CTXSYS.CONTEXT
해설 (2)

방금 찾을 경우 a 매치.

SELECT * FROM MyTable WHERE INSTR('word1 word2 word3',Column1)0

SQL Server:

CHARINDEX(Column1, 'word1 word2 word3', 1)0

정확히 일치하는 얻을 수 있습니다. 예 ' (& # 39;;) a, ab, ac, & # 39, & # 39, & # 39 b;;;;) 'get a 매치 않습니다.

SELECT * FROM MyTable WHERE INSTR(';word1;word2;word3;',';'||Column1||';')0
해설 (1)

이 경우 전체 텍스트 검색을 통해 수행됨 sql server 의 사용하는 것이 바람직합니다. 그러나 필요에 따라 can& # 39, 여기에 몇 가지 이유로 t get 워킹 DB 성능 집약형에 mcds - "'

  • 테이블 검색에 Dbo.미터블 테이블 만들기 ( int 미타브레이드 아이디 (1, 1), NOT NULL 코드 varchar (200) NOT NULL, 이 열에 설명두 varchar (200) NOT NULL 값을 검색에 계획입니다 [주]) 에 검색하기를
  • 문자열 검색 기능을 통해 개별 나치도요 분판된 분할하려면 공간 [프린스플리트] (@StringInput 노바르처 (최대), 생성 함수 [dbo]. @Delimiter 노바르처 (1)) @Outputtable 되돌려줍니다 표 ( id 노바르처 (1000년) ) TPC. 시작한다. 너희가운데 @String 노바르처 (100); 렌 (@StringInput) 동안 &gt. 0 시작한다. 설정되었습니다 @String = 왼쪽 (@StringInput, 이누얼 (누이프 (하리네스 (@Delimiter, @StringInput) - 1, - 1) 렌 (@StringInput))); @Stringinput 설정되었습니다 SUBSTRING (@StringInput 이누얼 (누이프 (하리네스, = ( @Stringinput @delimiter, ), 0 ), 렌 ( @StringInput) )
  • 1, 렌 (@StringInput)); 삽입하십시오 @OutputTable (id) 값 (@String); 끝. 반품하십시오. 끝. 검색하기를
  • 이것은 검색 스크립트입니다 변환할 수 있는 저장 프로시저 /function 선택적으로 & # 39, 급성 감염 쇱そ genito& @search 너희가운데 varchar (최대) = # 39;; - 여기서 입력하십시오. 검색어를 구체화하십시오
  • 위 문자열을 검색할 수 있는 다음 행으로 줘야 할
  • 편을 제니투안테스티나르 급성 감염 쇱そ 있는 것
  • 급성 감염에 쇱そ 있는 치아
  • 제니투안테스티나르 급성 통증 if (렌 (트리밍할 (@search)) = 0) = 만약 비워집니다, 그냥 순서화된 문자순으로 복귀하십시오 레코드전자문서의 문자열 검색 시작한다. 우선 순위, 1 을 선택, 코드, 설명스크립트 미타브레이드 미터블 에서 order by 설명 반품하십시오. end 너희가운데 @splitTable 표 ( int (1.1), - 우선 순위에 따라 개별 말은 워트랭크 id 만 담당 (순서대로 선두로부터 / 위치) 말을해야합니다 varchar (200) ) 너희가운데 @nonWordTable 표 (테이블 등의 보조 동사, 다음은 대표적인 성조군의 예이다 검색에서 트림하려면 아웃해야 - id varchar (200) ) @nonwordtable 값을 삽입하십시오 (& # 39, of& # 39;) (& # 39, with& # 39;) (# 39, & # 39 at&;) (& # 39, in& # 39;) (& # 39, for& # 39;) (& # 39, on& # 39;) (& # 39, by& # 39;) (& # 39, like& # 39;) (& # 39, up& # 39;) (& # 39, off& # 39;) (& # 39, near& # 39;) (& # 39, is& # 39;) (& # 39, are& # 39;) (& # 39, & # 39;) (& # 39, :& # 39;) (& # 39, & # 39;;) @splittable 삽입하십시오 데브오픈스플리트 (@search, & # 39, id 를 선택합니다. & # 39;). - 이 기능을 사용하면 검색 등 모든 공간을 함께 테이블을 행으로 분판된 나치도요 출력물에는 적립율은 - 이 예:
  • id
  • 감염
  • 쇱そ
  • 급성
  • 헨리토 n = s 의 s 를 삭제하시겠습니까 @splitTable 참가하십시오 @nonWordTable s.워드 니컬러스이드. 여기 비 단어 트림하기 아웃해야 - 너희가운데 @countOfSearchStrings int = (select count (word) 를 @splitTable); - 카운트입니다 분판된 나치도요 검색을 위한 공간 너희가운데 @highestPriority int = 전원 (@countOfSearchStrings, 3). 플랭매슈스 함께 있다 ( 미타브레이드 Priority 를 선택, @highestPriority 미터블 설명에 따라 우선 순위를 정확히 일치하는 %s/dbase/ext_table. 같은 @search - 연합 & # 39 의 설명에 따라 선택, @highestPriority-1 미타브레이드 우선_순위 미터블 @search %& # 39 와 같은 +;; - 그럼 뭔가 함께 끝에 연합 & # 39 의 설명에 따라 선택, @highestPriority-2 미타브레이드 미터블 %& # 39 와 같은 우선_순위;; + @search 가진 다음 처음부터 뭔가 - 연합 & # 39 의 설명에 따라 선택, @highestPriority-3 미타브레이드 미터블 %& # 39 와 같은 우선_순위;; + + @search %& # 39, & # 39. 그 사이 어딘가에 신앙이니라 단어 폭포 - ), 스플리트워드 매슈스 as (-) 는 문자열 검색 순위 자리를 찾은 단어는 열거하십시오 바탕으로 각
  • 그 필드에서 검색 및 계산하십시오 챨 인덱스화할 우선 순위, s.워드 미타브레이미타브레이드 (@countOfSearchStrings - s.워트랭크) 를 선택하고, 워디네스 = 하리네스 미터블 @splitTable & # 39 에 미타브레이드체리티온 (s.워드, 미타브레이드체리티온) 를 참가하십시오 %& # 39, & # 39 와 같은 + + s.워드 %& # 39;;;
  • 않고 있습니다. (일부 미타브레이드 퍼시미타브레이드 creditbank. 플랭매슈스 에서 p = 미타브레이미타브레이드) - 않아도 이미 발견된 플랭매슈스 미타브레스 들여다 볼 수 있기 때문에 높은 랭크
  • 이 번호요 표시되어도 해버린다는거, 주석 달기 때문에 시간이 오래 걸리는 것으로 결과에 대한 아무런 영향을 미치지 않습니다. ), 매칭로스윗홀워즈 as ( 미타브레이드 미터블카운트 스플리트워드 매슈스 그룹순 (미타브레이드) 에서, 수 (미타브레이드) 를 선택 할 수 (미타브레이드) = @countOfSearchStrings )
  • 트리밍할 끕니까 스테 don& 경우 여기에 # 39 는 우선 것으로 간주되려면 단어 오더할 t care about. 워디네스르팅스 as (더 이상 발생하지 않도록 챨 반전합니다 indexe 레트리프트 단어들은요 이전 %s/dbase/ext_table. 웨이티지 - 정상화 후 그 값을 순차인지 - 우선, 단어 선택, s.미타브레이드 ROW_NUMBER () 는 (파티션에만 s.미타브레이드 의해 order by 워디네스 desc) 를 콩파라티베워디네스 s = 맥미타브레이드 s.미타브레이드 충스러웠으니 스플리트워드 매슈스 참가하십시오 매칭로스윗홀워즈 m 의 ) , 워디네스자쿠엔세르팅스 as (- 이 작업을 수행해야 할 수 있도록 검색 문자열은 동일한 단어에서 찾아볼 수 있는 경우, 2 행
  • 순서에 필드에 값이 더 높은 우선 순위를 고려하지 w.미타브레이드 선택, w.워드 (윌리엄 프라이어티 가속 시 가용 (자크 케드프리오티, 0) + + w.콤프라티베워디네스) 를 우선 순위 w 의 왼쪽 워디네스르팅스 참가하십시오 ( ,, 수 (w1.myTableid) 를 자크 케드프리오티 w1.comparativeWordIndex w1.word w1.priority w1.myTableid 선택합니다. w1 bigadmin 워디네스르팅스 w1.myTableId = w2 및 w1.Priority w2.myTableId 충스러웠으니 워디네스르팅스 대한 &gt. w2.comparativewordindex w2.priority 및 w1.comparativeWordIndex&gt. 그룹순 w1.myTableid w1.priority w1.comparativeWordIndex w1.word,, ) 세쿠엔케드프리오티 w.미타브레이드 = 세쿠엔케드프리오르티스미타브레이드 와 w 의. 우선 순위 = 세쿠엔케드프리오르티스프리오티 ), 프리오리티스데스플리트워드 매슈스 as (- 이 값을 계산하는 대한 누적 우선_순위 필드 select sum (w1.Priority) 를 통해 워디네스자쿠엔세르팅스 w1 bigadmin 워디네스자쿠엔세르팅스 로베르 앨프리오티 w1.myTableId, w2 에 w2.myTableId w1.myTableId = 여기서 w1.word &lt >; w2.word 그룹순 w1.myTableid ), 콤프레테스트 as ( get 일반 일치시킵니다 플랭매슈스 미타브레이드 priority 를 선택, 있어야 할 최고 랭크 연합 get 랭크 분할되었습니다 프리오리티스데스플리트워드 매슈스 미타브레이드 로베르 앨프리오티 tpc. priority 를 선택, 단어 (word) 는 검색 순위를 기준으로 오더할 있는 문자열과 e0100042.log) 일치시킵니다 ), 막시미즈데콤프레테스트 as (- 우선 순위를 설정할 필드 값 = 최대 우선_순위 해당 필드의 값 미타브레이드 콤프레테스트 그룹순 미타브레이드 Priority 를 선택, 최대 (priority) 를 ) 우선, 선택, 설명스크립트 막시미즈데콤프레테스트 m 에서 미터블 켜짐이 맥미타브레이드 = 미타브레이미타브레이드 참가하십시오 미타브레이미타브레이드, 코드 order by 우선_순위 설명, order by 우선_순위 desc afaq 최고 점수 상위 항목에 대한 설명 -
  • 0 - 옵션임 페이징의 행뿐만 페치할 행뿐만 오프셋할 앞으로 50 만 "'
해설 (0)

테이블에 대한 최선의 방법은 전체_텍스트 인덱스화할 열을 올리고 있다 대신 같은 컨테인먼트하는 및 사용

SELECT * FROM MyTable WHERE 
contains(Column1 , N'word1' )
AND contains(Column1 , N'word2' )
AND contains(Column1 , N'word3' )
해설 (0)

사용하지 않는 이유는 &quot in"; 대신?

Select *
from table
where columnname in (word1, word2, word3)
해설 (3)

가장 간편한 방법을 사용하여 지정하십시오. 성취 언급된 문제는 & # 39, & # [map_layer] [1] 와 가까왔는지 39 ~;). 예를 들어, 다음 기회를 줄 것이라고 쿼리합니다 포함하도록 하는 모든 열이 word1, word2 및 word3.

SELECT * FROM MyTable WHERE CONTAINS(Column1, 'word1 NEAR word2 NEAR word3')

SELECT * FROM MyTable WHERE CONTAINS(Column1, 'word1 ~ word2 ~ word3')

또한 각 문서의 콘테인스터블 a 랭크 되돌려줍니다 근접도를 &quot word1&quot &quot word2&quot 따라;;;; 그리고 word3&quot ";). 예를 들어,,) 는, 이 문서에서는 마디였나 &quot word2 및 word3 word1 &quot. 그 때문에 서로 다른 지역보다 더 높은 순위를 약간만이라도 약관은 문서.

다른 한 심아이엔큐 싶다 찾을 수 있는 것은 우리가 사용할 수 있으며 추가 proximity_term 열이 특정 거리 안에 있는 말은 그들 사이에 열 구입니다.

[1]: 2017년 보기 = sql server https://docs.microsoft.com/en-us/sql/t-sql/queries/contains-transact-sql?

해설 (0)

테사루스 search&quot, &quot 사용하려고 합니다. 전체 텍스트 인덱스화할 MS SQL Server. 이는 사용하는 것보다 훨씬 더 좋은 &quot %"; 경우 찾기 위해 수백만 레코드는유지합니다. 투명지에 테사루스 비해 적은 양의 메모리 소비가 된다. 이 기능을 검색 봅니다:)

해설 (0)
SELECT * FROM MyTable WHERE Column1 Like "*word*"

그러면 여기서 '부분' 의 값을 포함하는 모든 기록은 표시하십시오 column1 'word'.

해설 (0)
DECLARE @SearchStr nvarchar(100)
SET @SearchStr = ' '

CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL

BEGIN
    SET @ColumnName = ''
    SET @TableName = 
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM     INFORMATION_SCHEMA.TABLES
        WHERE         TABLE_TYPE = 'BASE TABLE'
            AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
            AND    OBJECTPROPERTY(
                    OBJECT_ID(
                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                         ), 'IsMSShipped'
                           ) = 0
    )

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)

    BEGIN
        SET @ColumnName =
        (
            SELECT MIN(QUOTENAME(COLUMN_NAME))
            FROM     INFORMATION_SCHEMA.COLUMNS
            WHERE         TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND    TABLE_NAME    = PARSENAME(@TableName, 1)
                AND    DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')
                AND    QUOTENAME(COLUMN_NAME) > @ColumnName
        )

        IF @ColumnName IS NOT NULL

        BEGIN
            INSERT INTO #Results
            EXEC
            (
                'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' +
                ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
            )
        END
    END   
END

SELECT ColumnName, ColumnValue FROM #Results

DROP TABLE #Results
해설 (1)
select * from table where name regexp '^word[1-3]$'

또는

select * from table where name in ('word1','word2','word3')
해설 (4)