Pergunta

Eu preciso de algo entre uma pesquisa de texto completo e uma pesquisa de índice:
Quero pesquisar texto em uma coluna da minha mesa (provavelmente haverá um índice na coluna, também, se o que importa).

O problema é que eu quero procurar palavras na coluna, mas eu não quero corresponder partes.

Por exemplo, a minha coluna pode conter nomes de negócio:
Poderoso Muck Miller and Partners Inc.
Boy & Manteiga Pequeno Almoço empresa

Agora, se eu procurar por " Miller " Eu quero encontrar a primeira linha. Mas se eu procurar por " Iller " Eu não quero encontrá-lo, porque não há nenhuma palavra que começa com "Iller". Procurando por " Break " deve encontrar " Boy & Manteiga Pequeno Almoço empresa ", porém, desde que uma palavra está começando com " Break ".

Então, se eu tentar e uso

WHERE BusinessName LIKE %Break%

vai encontrar muitos hits.

Existe alguma maneira para procurar palavras separadas por espaços em branco ou outros delimitadores ?

(LINQ seria melhor, SQL simples faria, também)

Importante: Os espaços estão longe de ser os únicos delimitadores! Barras, vírgulas, pontos, todos os caracteres não alfanuméricos devem ser considerados para que isso funcione!

Foi útil?

Solução

SQL Server 2000 ou superior.

SELECT *
  FROM dbo.TblBusinessNames
 WHERE BusinessName like '%[^A-z^0-9]Break%' -- In the middle of a sentence
    OR BusinessName like 'Break%'            -- At the beginning of a sentence

Palavra-chave Referência para COMO : http://msdn.microsoft.com/en-us/library/aa933232 (SQL.80) .aspx

Outras dicas

Seus separadores de palavras vão ser muitos: espaço, tabulação, o início da linha, parênteses, pontos, vírgulas de exclamação / pontos de interrogação etc Então, uma solução muito simples é usar um regex na sua cláusula WHERE. (E isso vai ser muito mais eficiente do que apenas ORing cada delimitador possível que você pode pensar.)

Uma vez que você mencionou LINQ, aqui está um artigo que descreve como fazer regex eficiente consulta com o SQL Server .

Complicated cláusulas WHERE como este sempre levantar uma bandeira vermelha com me tanto quanto o desempenho está em causa, então eu definitivamente sugerem aferição tudo o que você acabar com, você pode decidir construir um índice de pesquisa para a coluna depois de tudo.

EDIT: Saw você editou sua pergunta. Quando escrever seu regex, é fácil apenas tem que usar qualquer caractere não-alphanum como delimitador, ou seja, [^ 0-9a-zA-Z], ou \ W por qualquer carácter não-palavra, \ b para qualquer limite de palavra e \ b para qualquer não-limite de palavra. Ou, em vez de delimitadores correspondência, apenas corresponder a qualquer palavra, ou seja, \ w +. Aqui está outro exemplo de alguém fazendo pesquisas regex com o SQL Server ( mais complicado do que o que você precisa).

where BusinessName like 'Break%' -- to find if it is beginning with the word
or BusinessName like '% Break%' -- to find if it contains the word anywhere but the beginning
WHERE BusinessName LIKE '% Break%'

Você mencionou LINQ - você poderia fazer algo assim ...

string myPattern = "% Break%";

var query =
      from b in Business
      where SqlMethods.Like(b.BusinessName, myPattern) 
      select b;

Note que este usa o namespace System.Linq.Data.SqlClient que se traduz diretamente para o operador LIKE sem processamento adicional.

Tente isto:

declare @vSearch nvarchar(100)

set @vSearch = 'About'

select * from btTab where ' ' + vText + ' ' LIKE '%[^A-z^0-9]' + @vSearch + '[^A-z^0-9]%'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top