locked
Prioridade no Order By RRS feed

  • 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 Snippet

    DECLARE @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 WHERE

    LIVRO_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 WHERE

    LIVRO_TITULO LIKE '%Recursos Humanos%' OR LIVRO_DESC LIKE '%Recursos Humanos%'

    ORDER BY CHARINDEX('Recursos Humanos',LIVRO_TITULO) DESC

     

    Se 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 Snippet

    DECLARE @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 WHERE

    LIVRO_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 WHERE

    LIVRO_TITULO LIKE '%Recursos Humanos%' OR LIVRO_DESC LIKE '%Recursos Humanos%'

    ORDER BY CHARINDEX('Recursos Humanos',LIVRO_TITULO) DESC

     

    Se 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