Eu preciso de um select que retorne resultados como este:
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'
E eu preciso de todos os resultados, ou seja, isso inclui seqüências de caracteres com 'word2 word3 word1' ou 'word1 word3 word2' ou qualquer outra combinação dos três.
Todas as palavras precisam estar no resultado.
word3 word2 word1
.Observe que, se você
LIKE
determinar para determinar se uma sequência é uma subcadeia de caracteres de outra sequência, deverá escapar do padrão que corresponde aos caracteres na sequência de caracteres de pesquisa.Se o seu dialeto SQL suportar
CHARINDEX
, é muito mais fácil usá-lo:Além disso, lembre-se de que esse e o método na resposta aceita cobrem apenas a correspondência de substring em vez da correspondência de palavras. Então, por exemplo, a string
'word1word2word3'
ainda corresponderia.fonte
InStr()
vez dissoCHARINDEX
Função
Inquerir
fonte
Em vez de
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'
, adicione E entre essas palavras como:para obter detalhes, consulte aqui https://msdn.microsoft.com/en-us/library/ms187787.aspx
ATUALIZAR
Para selecionar frases, use aspas duplas como:
ps, você deve primeiro ativar a Pesquisa de texto completo na tabela antes de usar o contains keyword. para obter mais detalhes, consulte aqui https://docs.microsoft.com/en-us/sql/relational-databases/search/get-started-with-full-text-search
fonte
Alterado
OR
para comAND
base na edição da pergunta.fonte
Se você estiver usando o Oracle Database , poderá conseguir isso usando a consulta contém . Contém consultas mais rápidas do que as consultas semelhantes.
Se você precisar de todas as palavras
Se você precisar de alguma das palavras
Contém um índice necessário do tipo CONTEXT na sua coluna.
fonte
Se você só quer encontrar uma correspondência.
Servidor SQL :
Para obter a correspondência exata. O exemplo
(';a;ab;ac;',';b;')
não será compatível.fonte
tente usar a "pesquisa de tesarus" no índice de texto completo no MS SQL Server. Isso é muito melhor do que usar "%" na pesquisa se você tiver milhões de registros. tesarus tem uma pequena quantidade de consumo de memória do que os outros. tente pesquisar essas funções :)
fonte
A melhor maneira é criar um índice de texto completo em uma coluna da tabela e usar o include em vez do LIKE
fonte
por que não usar "in"?
fonte
Uma das maneiras mais fáceis de obter o que é mencionado na pergunta é usando CONTAINS com NEAR ou '~'. Por exemplo, as consultas a seguir nos forneceriam todas as colunas que incluem especificamente word1, word2 e word3.
Além disso, CONTAINSTABLE retorna uma classificação para cada documento com base na proximidade de "palavra1", "palavra2" e "palavra3". Por exemplo, se um documento contiver a frase "A palavra1 é palavra2 e palavra3", sua classificação será alta porque os termos estão mais próximos um do outro do que em outros documentos.
Outra coisa que gostaria de acrescentar é que também podemos usar o proximidade_termo para encontrar colunas onde as palavras estão dentro de uma distância específica entre elas na frase da coluna.
fonte
Idealmente, isso deve ser feito com a ajuda da pesquisa de texto completo do servidor sql, se estiver sendo usada. No entanto, se você não conseguir fazer isso funcionar no seu banco de dados por algum motivo, aqui está uma solução com alto desempenho:
fonte
Isso exibirá todos os registros em que
column1
contém um valor parcialword
.fonte
fonte
ou
fonte