Usuário com melhor resposta
Busca composta

Pergunta
-
E ae Pessoal,
Preciso fazer uma busca com 1 ou mais palavras.
Alguma coisa assim :
SELECT
Id_Ativo, Nome, Simbolo FROM Tb001_AtivosWHERE
Simbolo LIKE '%petr%' or Simbolo LIKE '%vale%' order by SimboloMas o duro é que nunca sei quantas palavras o usuario vai digitar, acho que é como os buscadores fazem.
Alguem pode dar uma ajuda.
Valew
Respostas
-
O exemplo abaixo cria uma vriável com o comando like e grava em uma tabela temporária. Vc pode criar a query com "OR" mas acho que gerando um tabela temporária garante mais performance.
A query abaixo poderá ser tranformada em sp basta passar o parâmetro @texto_procurado = 'petr,vale' separado por "," (virgulas) o que pode ser feito no aplicativo. Na query exemplo é feito um tipo de split (recupero cada parametro entra as "," e gera um EXEC.
Code SnippetCREATE TABLE #TAB ( TEXTO VARCHAR(4000))
INSERT INTO #TAB ( TEXTO ) VALUES ('PETROBRAS')
INSERT INTO #TAB ( TEXTO ) VALUES ('VALE')
INSERT INTO #TAB ( TEXTO ) VALUES ('VILA')
INSERT INTO #TAB ( TEXTO ) VALUES ('PARAOPEBA')
INSERT INTO #TAB ( TEXTO ) VALUES ('PRETOLEO')CREATE TABLE #RES ( TEXTO_RESUTADO VARCHAR(4000))
DECLARE @TEXTO_PROCURADO VARCHAR(400),
@FORMA VARCHAR(30),
@COMANDO VARCHAR(4000),
@DELIMITADOR VARCHAR(2)
--DEFINE QUE VAI SER O DELIMITADOR
SET @DELIMITADOR = ','--DEFINE PARAMETRO DE ENTRADA
SET @TEXTO_PROCURADO = 'PETR,VALE'IF LEN(@TEXTO_PROCURADO) > 0 SET @TEXTO_PROCURADO = @TEXTO_PROCURADO + @DELIMITADOR
--INICIA LOOP PARA EXTRAIR TEXTO PARA EFETUAR A ATUALZIAÇÃO
WHILE LEN(RTRIM(LTRIM(@TEXTO_PROCURADO))) > 0
BEGIN
SET @COMANDO = 'INSERT INTO #RES (TEXTO_RESUTADO) SELECT TEXTO FROM #TAB WHERE TEXTO LIKE '
SET @FORMA = RTRIM(LTRIM(SUBSTRING(@TEXTO_PROCURADO, 1, CHARINDEX(@DELIMITADOR, @TEXTO_PROCURADO) - 1)))
SET @COMANDO = @COMANDO + '''' + '%' + @FORMA + '%'+ ''''EXEC (@COMANDO)
PRINT (@COMANDO)SELECT @TEXTO_PROCURADO =
SUBSTRING(@TEXTO_PROCURADO , CHARINDEX(@DELIMITADOR, @TEXTO_PROCURADO ) + 1, LEN(@TEXTO_PROCURADO ))END
SELECT * FROM #RES
DROP TABLE #TAB
DROP TABLE #RES
Todas as Respostas
-
O exemplo abaixo cria uma vriável com o comando like e grava em uma tabela temporária. Vc pode criar a query com "OR" mas acho que gerando um tabela temporária garante mais performance.
A query abaixo poderá ser tranformada em sp basta passar o parâmetro @texto_procurado = 'petr,vale' separado por "," (virgulas) o que pode ser feito no aplicativo. Na query exemplo é feito um tipo de split (recupero cada parametro entra as "," e gera um EXEC.
Code SnippetCREATE TABLE #TAB ( TEXTO VARCHAR(4000))
INSERT INTO #TAB ( TEXTO ) VALUES ('PETROBRAS')
INSERT INTO #TAB ( TEXTO ) VALUES ('VALE')
INSERT INTO #TAB ( TEXTO ) VALUES ('VILA')
INSERT INTO #TAB ( TEXTO ) VALUES ('PARAOPEBA')
INSERT INTO #TAB ( TEXTO ) VALUES ('PRETOLEO')CREATE TABLE #RES ( TEXTO_RESUTADO VARCHAR(4000))
DECLARE @TEXTO_PROCURADO VARCHAR(400),
@FORMA VARCHAR(30),
@COMANDO VARCHAR(4000),
@DELIMITADOR VARCHAR(2)
--DEFINE QUE VAI SER O DELIMITADOR
SET @DELIMITADOR = ','--DEFINE PARAMETRO DE ENTRADA
SET @TEXTO_PROCURADO = 'PETR,VALE'IF LEN(@TEXTO_PROCURADO) > 0 SET @TEXTO_PROCURADO = @TEXTO_PROCURADO + @DELIMITADOR
--INICIA LOOP PARA EXTRAIR TEXTO PARA EFETUAR A ATUALZIAÇÃO
WHILE LEN(RTRIM(LTRIM(@TEXTO_PROCURADO))) > 0
BEGIN
SET @COMANDO = 'INSERT INTO #RES (TEXTO_RESUTADO) SELECT TEXTO FROM #TAB WHERE TEXTO LIKE '
SET @FORMA = RTRIM(LTRIM(SUBSTRING(@TEXTO_PROCURADO, 1, CHARINDEX(@DELIMITADOR, @TEXTO_PROCURADO) - 1)))
SET @COMANDO = @COMANDO + '''' + '%' + @FORMA + '%'+ ''''EXEC (@COMANDO)
PRINT (@COMANDO)SELECT @TEXTO_PROCURADO =
SUBSTRING(@TEXTO_PROCURADO , CHARINDEX(@DELIMITADOR, @TEXTO_PROCURADO ) + 1, LEN(@TEXTO_PROCURADO ))END
SELECT * FROM #RES
DROP TABLE #TAB
DROP TABLE #RES -
-
-
-
cara, certa vez fiz algo assim:
If
Exists(Select * From sysobjects Where name = 'fnVariavel')GO
Create
Function fnVariavel(@String
)
Returns
@Array Table(Valor
)
As
Begin
End
GO
Declare
@CHAVE
Set
@CHAVE = 'CHAVES PARA PESQUISA, BUSCA'Set
@LIMITE = (Select Count(valor) From fnVariavel(@CHAVE,','))Set
@COMM = 'Select CAMPO From TABELA Where 'Declare
Cur Cursor For Select Row_Number() Over (Order By Valor) As Seq, Valor From fnVariavel(@CHAVE, ',')Open
CurWhile @@Fetch_Status = 0
Begin
End
Close
CurDeallocate
CurSet
@COMM = @COMM + 'Order By CAMPO'Exec
(@COMM)claro, onde tem CAMPO e TABELA, trocar pelo nome do campo e tabela pesquisada... não sei se ajuda
-
Bom Dia,
Os scripts em TSQL estão bem criativos e de fato são capazes de retornar o esperado. Para uma tabela de títulos do mercado financeiro esse tipo de construção é suficiente (somando ações e opções não teríamos seqüer 10.000 papéis para pesquisar).
No entanto para volumes de dados maiores (ou até para uma construção mais clara), considere utilizar o FULL TEXT INDEX. Sua consulta poderia ser facilmente escrita da seguinte forma:
Code SnippetSELECT
PapelFROM
AtivosWHERE
CONTAINS(Papel, ' "PETR" OR "VALE" ')GO
[ ]s,
Gustavo