Usuário com melhor resposta
Prioridade no Order By

Pergunta
-
Olá,
sou desenvolvedor de sites, e no momento estou priorizando a ferramenta de busca de um deles.
Gostaria de saber se há alguma solução para o caso a seguir:
Há uma tabela TB_LIVRO com a seguinte estrutura:
CREATE TABLE TB_LIVRO
(
LIVRO_COD INT IDENTITY PRIMARY KEY
LIVRO_TITULO VARCHAR(100)
LIVRO_DESC TEXT
)
Se uma pessoa digitasse "recursos humanos", a consulta ficaria assim:
SELECT LIVRO_COD, LIVRO_TITULO_ LIVRO_DESC FROM TB_LIVRO WITH(NOLOCK) WHERE LIVRO_TITULO LIKE 'recursos humanos' OR LIVRO_DESC LIKE 'recursos humanos'
Há algum método de ORDER BY, na qual PRIORIZAVA os resultados que possui o termo pesquisado na coluna LIVRO_TITULO, ou seja, primeiro aparece os resultados com o termo em LIVRO_TITULO, depois os resultados em LIVRO_DESC?
Isso eu consigo fazer em 2 instruções SQL, mas como envolve paginação de resultados, gostaria de fazer essa query em uma única instrução.
Alguém aí para me ajudar?
Grato...
terça-feira, 11 de novembro de 2008 13:25
Respostas
-
Bom Dia Leobreda,
Seja bem vindo ao fórum de SQL Server do Technet. Nós participantes do fórum tentaremos ajudá-lo até onde for possível através do nosso conhecimento, experiência e disponibilidade nas solução de suas dúvidas e problemas.
Primeiramente recomendaria rever sua instrução SQL. Não acho uma boa prática usar o NOLOCK sem que haja de fato necessidade. Em segundo lugar vale a pena lembrar que a instrução LIKE sem o % é semelhante a uma igualdade no retorno dos resultados (O LIKE é menos performático que o =).
Especificamente sobre o seu problema, acredito que o script abaixo o inspire
Code SnippetDECLARE
@TB_LIVRO TABLE (LIVRO_COD INT IDENTITY PRIMARY KEY,LIVRO_TITULO
VARCHAR(100),LIVRO_DESC TEXT)INSERT
INTO @TB_LIVRO VALUES ('Gestão de Pessoas', 'Livro especializado em recursos humanos')INSERT
INTO @TB_LIVRO VALUES ('Recursos Humanos', 'Livro que trata sobre a gestão de recursos humanos')INSERT
INTO @TB_LIVRO VALUES ('Desafios organizacionais','Como melhorar a motivação dos recursos humanos')INSERT
INTO @TB_LIVRO VALUES ('Finanças empresariais','Lidando com o fluxo de caixa')INSERT
INTO @TB_LIVRO VALUES ('APO','Livro que trata da administração por objetivos')-- Apenas 3 livros possuem referência a recursos humanos
SELECT
LIVRO_COD, LIVRO_TITULO, LIVRO_DESC FROM @TB_LIVRO WHERELIVRO_TITULO
LIKE '%Recursos Humanos%' OR LIVRO_DESC LIKE '%Recursos Humanos%'-- Prioridade para a coluna de LIVRO_TITULO na ordenação
SELECT LIVRO_COD, LIVRO_TITULO, LIVRO_DESC FROM @TB_LIVRO WHERELIVRO_TITULO
LIKE '%Recursos Humanos%' OR LIVRO_DESC LIKE '%Recursos Humanos%'ORDER
BY CHARINDEX('Recursos Humanos',LIVRO_TITULO) DESCSe o script for capaz de resolver o seu problema eu pediria que você classificasse a resposta marcando-a como respondida.
[ ]s,
Gustavo
terça-feira, 11 de novembro de 2008 14:22
Todas as Respostas
-
Bom Dia Leobreda,
Seja bem vindo ao fórum de SQL Server do Technet. Nós participantes do fórum tentaremos ajudá-lo até onde for possível através do nosso conhecimento, experiência e disponibilidade nas solução de suas dúvidas e problemas.
Primeiramente recomendaria rever sua instrução SQL. Não acho uma boa prática usar o NOLOCK sem que haja de fato necessidade. Em segundo lugar vale a pena lembrar que a instrução LIKE sem o % é semelhante a uma igualdade no retorno dos resultados (O LIKE é menos performático que o =).
Especificamente sobre o seu problema, acredito que o script abaixo o inspire
Code SnippetDECLARE
@TB_LIVRO TABLE (LIVRO_COD INT IDENTITY PRIMARY KEY,LIVRO_TITULO
VARCHAR(100),LIVRO_DESC TEXT)INSERT
INTO @TB_LIVRO VALUES ('Gestão de Pessoas', 'Livro especializado em recursos humanos')INSERT
INTO @TB_LIVRO VALUES ('Recursos Humanos', 'Livro que trata sobre a gestão de recursos humanos')INSERT
INTO @TB_LIVRO VALUES ('Desafios organizacionais','Como melhorar a motivação dos recursos humanos')INSERT
INTO @TB_LIVRO VALUES ('Finanças empresariais','Lidando com o fluxo de caixa')INSERT
INTO @TB_LIVRO VALUES ('APO','Livro que trata da administração por objetivos')-- Apenas 3 livros possuem referência a recursos humanos
SELECT
LIVRO_COD, LIVRO_TITULO, LIVRO_DESC FROM @TB_LIVRO WHERELIVRO_TITULO
LIKE '%Recursos Humanos%' OR LIVRO_DESC LIKE '%Recursos Humanos%'-- Prioridade para a coluna de LIVRO_TITULO na ordenação
SELECT LIVRO_COD, LIVRO_TITULO, LIVRO_DESC FROM @TB_LIVRO WHERELIVRO_TITULO
LIKE '%Recursos Humanos%' OR LIVRO_DESC LIKE '%Recursos Humanos%'ORDER
BY CHARINDEX('Recursos Humanos',LIVRO_TITULO) DESCSe o script for capaz de resolver o seu problema eu pediria que você classificasse a resposta marcando-a como respondida.
[ ]s,
Gustavo
terça-feira, 11 de novembro de 2008 14:22 -
Gustavo, bom dia!
Pessoas assim como você merece levar aplausos! Ainda mais com a quantidade de respostas suas...
Em primeiro lugar, este único exemplo de código me fez DESTRUIR minha rotina de busca (vou ter que refazer!rs) que era de mais de 5 consultas, para uma única consulta!
Em segundo lugar, o desempenho nas buscas melhorou EXCESSIVAMENTE, pois a cada query que realizava, montava cada resultado num vetor (ASP), o que era necessário manipular o vetor a todo o momento.
Quanto ao LIKE, acabei esquecendo de informar o "%" (na hora, estava desenvolvendo justamente uma rotina de busca com o método EXPRESSÃO EXATA).
Sobre o seu exemplo de código, gostaria de colocar isso em meu Blog (www.leobreda.com) com seus devidos méritos. Isso é possível?
Obrigado,
Leonardo Breda
quarta-feira, 12 de novembro de 2008 11:21 -
Olá Leonardo,
Fico lisonjeado com os elogios. É gratificante ver que a partir do script você resolveu o seu problema entre outras coisas. Fique à vontade para publicar, não tem nenhum problema não. Quanto mais o conhecimento for disseminado melhor, pois, certamente outros o aperfeiçoarão.
Quando estiver familiarizado com esse código, procure conhecer a funcionalidade FULLTEXT SEARCH do SQL Server. Creio que ela lhe será bastante útil quando estiver fazendo pesquisas desse tipo em tabelas muito grandes.
[ ]s,
Gustavo
quarta-feira, 12 de novembro de 2008 20:39