none
Pesquisar no front pelo nome mas no back pelo ID RRS feed

  • Pergunta

  • Estou com o seguinte problema, possuo uma tela onde tem um campo de pesquisa usando like por nome mas preciso que internamente a pesquisa seja feita buscando pelo Id. Por exemplo, quero pesquisar pelo funcionário andré mas internamente a query deve pesquisar pelo id. é possível fazer isso ?

    terça-feira, 10 de setembro de 2019 16:03

Respostas

  • Diego,

    Então, é justamente neste cenário que entra a maneira que você esta desenvolvendo, bem como, a forma que a linguagem de programação utilizada na sua aplicação vai permitir que isso seja aplicado.

    Esta query, que você compartilhou:

    select A.NUM_FRE, A.NOME from tb_funcionario a
    where a.id_supervisor = @idsupervisor

    Ela já esta trabalhando com o conceito de uma query parametrizada e dinâmica dentro da aplicação, ao meu ver, basta você mudar a condição no Where para algo similar a este exemplo:

    select A.NUM_FRE, A.NOME from tb_funcionario a
    where a.nome like '%'+@nomefuncionario+'%'

    No caso o parâmetro ou variável @nomefuncionario vai armazenar ou receber justamente o que sendo obtido no textbox que você digita o nome do funcionário.

    Se a sua linguagem de programação permitir, você pode declarar diretamente na sua query o nome do textbox como parâmetro, algo similar a este exemplo:

    select A.NUM_FRE, A.NOME from tb_funcionario a
    where a.nome like '%'+textbox.text+'%'

    Provavelmente esta query será transcrita internamente pelo SQL Server com base na instrução enviada por sua aplicação como uma Ad-hoc query e a mesma será processada e retornada.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta diego.lk sexta-feira, 13 de setembro de 2019 00:18
    quarta-feira, 11 de setembro de 2019 12:42
  • A seguinte query faz o que eu gostaria mas teria que se buscar pelo id do supervisor, coisa que não quero. Quero retornar esses mesmos valores porém buscando pelo nome do supervisor.

    Diego, se @VALOR contém o nome completo de funcionário que é supervisor e que foi selecionado pelo usuário, então experimente

    -- código #3 v2
    SELECT colunas funcionário
      from TB_FUNCIONARIO
      where id_supervisor = (SELECT id_funcionario 
                               from TB_FUNCIONARIO
                               where upper (NOME) like @VALOR
    and SUPERVISOR = 'S');

    O código acima considera que a coluna que identifica cada funcionário é a id_funcionario; altere para o nome correto. Em colunas funcionário deve-se informar as colunas dos vendedores que a consulta deve retornar.

    Considera ainda o que foi informado em "existe uma coluna chamada id supervisor, e é nela que é feito o vínculo do vendedor com o supervisor. todo vendedor deve possuir algum ID nessa coluna id_supervisor, que corresponde ao id do seu supervisor".

    O código #3 primeiro pesquisa pelo nome do supervisor, conforme você solicitou, e após encontra os vendedores que são supervisionados por ele.

    ---

    Se você retirar % da montagem de @VALOR, pode-se então alterar o código #3 para utilizar o operador = no lugar de LIKE. É mais eficiente, já que se tem o nome completo.

    A pesquisa por nome completo somente é correta caso não existam homônimos.

    ---

    Dúvida: pode existir supervisor de supervisor?

     



    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como Resposta diego.lk sexta-feira, 13 de setembro de 2019 00:18
    • Editado José Diz quinta-feira, 10 de outubro de 2019 09:10
    quarta-feira, 11 de setembro de 2019 13:12

Todas as Respostas

  • Olá Diego.

    Não é possível fazer isso, pois se o seu dado de entrada é o nome, a consulta no banco deverá ser feita por esse nome. 
    Você tem essa demanda de procurar pelo ID por causa de performance?

    Se sim, o que ajudaria é você criar um Full Text Index na coluna Nome e ao invés de usar o Like, usar o CONTAINS.

    A performance é bem melhor.

    https://luanmorenodba.com/2011/10/26/entenda-o-full-text-search/

    https://docs.microsoft.com/pt-br/sql/t-sql/statements/create-fulltext-index-transact-sql?view=sql-server-2017


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    terça-feira, 10 de setembro de 2019 16:19
  • Estou com o seguinte problema, possuo uma tela onde tem um campo de pesquisa usando like por nome mas preciso que internamente a pesquisa seja feita buscando pelo Id. Por exemplo, quero pesquisar pelo funcionário andré mas internamente a query deve pesquisar pelo id. é possível fazer isso ?

    Na tela é exibido um campo texto, onde o usuário escreve o nome a pesquisar ou é exibida uma lista de nomes de funcionários, onde o usuário clica sobre o nome de um dos funcionários?


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    terça-feira, 10 de setembro de 2019 16:40
  • Diego,

    Mas acredito que a pesquisa deverá ser feita pelo nome completo e não somente pelo primeiro nome.

    Não é mesmo? Poderia nos descrever como o usuário informa o nome e de que forma deverá ser feita a pesquisa.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 10 de setembro de 2019 18:57
  • Então, existe uma index com um campo de busca que faz o filtro usando o like, ou seja conforme vai digitando o nome vai aparcendo os resultados. se nessa pesquisa a mesma fosse feita pelo id do funcionario, tudo bem. Problema resolvido. Vou explicar melhor a situação.

    Existe uma tabela chamada funcionário e nela existem supervisores e vendedores, existe uma coluna chamada id supervisor, e é nela que é feito o vínculo do vendedor com o supervisor. todo vendedor deve possuir algum ID nessa coluna id_supervisor, que corresponde ao id do seu supervisor. Já os supervisores sempre ficam com essa coluna nula. 

    A questão é, como faço para na index da pagina,pesquisar pelo nome do supervisor e retornar todos os vendedores associados ao dito cujo ?

    Obrigado as respostas e ajuda de todos vocês.

    quarta-feira, 11 de setembro de 2019 01:44
  • (...) conforme vai digitando o nome vai aparcendo os resultados.

    Que resultados vão aparecendo? Seriam os nomes completos que correspondem ao que já foi digitado no campo de pesquisa por nome?

    A pesquisa é por nome de funcionário que se sabe que é supervisor ou por nome de funcionário do qual se procura o supervisor?

    ---

    Me parece que não é uma questão de SQL Server mas sim da forma como a aplicação está implementada. Ao pesquisar por nome usando o texto escrito pelo usuário, a consulta SQL pode retornar o nome completo e também o id do funcionário, mas na tela somente se exibiria o nome completo.

    Ao pesquisar por supervisor cujo nome inicie por JOAO, a consulta SQL inicial seria algo semelhante a

    -- código #1
    SELECT NOME_COMPLETO, ID_FUNCIONARIO
      from tbFUNCIONARIO
      where ID_SUPERVISOR is null
            and NOME_COMPLETO like 'JOAO%';

    A consulta SQL inicial retornaria então os seguintes nomes completos e respectivas identificações de funcionário:

    João Anacleto Simão    | 23
    João Marcos            | 67
    João Xisto Yanes       | 12

    Mas na tela do usuário somente seria exibido o nome completo, mas com todas as informações memorizadas pelo programa.

     
    Assim que o usuário clicar sobre um dos nomes que estejam em exibição, o programa utiliza então a id do funcionário para encontrar os funcionários que estão sob sua supervisão.
     

    -- código #2
    SELECT NOME_COMPLETO, ID_FUNCIONARIO, outras colunas
      from tbFUNCIONARIO
      where ID_SUPERVISOR = @id_funcionario;

    onde @id_funcionario é o conteúdo de ID_FUNCIONARIO correspondente ao nome completo do supervisor sobre o qual o usuário clicou.

     

    Lembre-se de marcar esta resposta se ela te ajudou a resolver o problema.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz quarta-feira, 11 de setembro de 2019 11:43
    quarta-feira, 11 de setembro de 2019 10:13
  • A pesquisa é pelo nome do supervisor. Conforme vai digitando o nome do mesmo vai aparecendo as opções. Digamos que o supervisor Claudio tem como supervisionado os vendedores Bruno, Adriano e Beatriz. Quando digitar no campo de busca o nome Claudio, vai listar o registro do mesmo, após seleciona-lo, deve retornar o nome desses 3 vendedores, cujo supervisor é o que foi digitado na busca. Entendeu ?
    • Editado diego.lk quarta-feira, 11 de setembro de 2019 11:36
    quarta-feira, 11 de setembro de 2019 11:34
  • Diego,

    Obrigado pelo esclarecimento, vou fazer somente uma observação, com base no que você descreveu:

    Todo vendedor possui um supervisor e os supervisores não possuem alguém acima, teoricamente este tipo de implementação não seria a mais indicada, pois temos um campo ID que aceita valores nulos.

    Então, não consigo entender em qual parte você esta "teoricamente" com dificuldades, como já existe uma query utilizando o operador Like para realizar a busca aproximada conforme o que esta sendo digitado, você possui esta relação, tem os IDs de cada funcionário sendo este vendedor.

    Qual é a dificuldade neste cenário? O que deve ser apresentado em tela, o nome completo, o ID, ambos?

    Acredito que você deve estar utilizando algo similar a uma grid ou até mesmo tabela/matrix para apresentar o resultado da pesquisa na sua aplicação.

    Eu concord com o José Diz, veja que a questão é definir como a aplicação vai apresentar os dados e não como ela vai buscar.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 11 de setembro de 2019 11:34
  • A pesquisa é pelo nome do supervisor. Conforme vai digitando o nome do mesmo vai aparecendo as opções. Digamos que o supervisor Claudio tem como supervisionado os vendedores Bruno, Adriano e Beatriz. Quando digitar no campo de busca o nome Claudio, vai listar o registro do mesmo, após seleciona-lo, deve retornar o nome desses 3 vendedores, cujo supervisor é o que foi digitado na busca. Entendeu ?

    Entendido.

    Com os códigos #1 e #2 você obtém os dados que necessita. O resto é resolvido no programa, conforme sugeri há pouco. A implementação depende dos recursos da linguagem de programação em uso.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    quarta-feira, 11 de setembro de 2019 11:40
  • A tela é essa abaixo. Quando digito o nome do supervisor está retornando o próprio, quando eu gostaria que retornasse os seus subordinados (vendedores). 

    A query usada numa API é essa:

    sql.AppendLine("SELECT A.NUM_FRE, A.NOME");

    sql.AppendLine("FROM TB_FUNCIONARIO A");

    sql.AppendLine("WHERE (UPPER(A.NOME) LIKE @VALOR) AND SUPERVISOR = 'S' ");

    parametros.Add("@VALOR", $"%{term.ToUpperInvariant()}%");


    A seguinte query faz o que eu gostaria mas teria que se buscar pelo id do supervisor, coisa que não quero. Quero retornar esses mesmos valores porém buscando pelo nome do supervisor.

    select A.NUM_FRE, A.NOME from tb_funcionario a
    where a.id_supervisor = @idsupervisor


    • Editado diego.lk quarta-feira, 11 de setembro de 2019 11:52
    quarta-feira, 11 de setembro de 2019 11:49
  • A pesquisa é pelo nome do supervisor. Conforme vai digitando o nome do mesmo vai aparecendo as opções. Digamos que o supervisor Claudio tem como supervisionado os vendedores Bruno, Adriano e Beatriz. Quando digitar no campo de busca o nome Claudio, vai listar o registro do mesmo, após seleciona-lo, deve retornar o nome desses 3 vendedores, cujo supervisor é o que foi digitado na busca. Entendeu ?

    Diego,

    Sim.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 11 de setembro de 2019 12:36
  • A pesquisa é pelo nome do supervisor. Conforme vai digitando o nome do mesmo vai aparecendo as opções. Digamos que o supervisor Claudio tem como supervisionado os vendedores Bruno, Adriano e Beatriz. Quando digitar no campo de busca o nome Claudio, vai listar o registro do mesmo, após seleciona-lo, deve retornar o nome desses 3 vendedores, cujo supervisor é o que foi digitado na busca. Entendeu ?

    Diego,

    Sim.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    Então como poderia montar essa query ?
    quarta-feira, 11 de setembro de 2019 12:37
  • Diego,

    Então, é justamente neste cenário que entra a maneira que você esta desenvolvendo, bem como, a forma que a linguagem de programação utilizada na sua aplicação vai permitir que isso seja aplicado.

    Esta query, que você compartilhou:

    select A.NUM_FRE, A.NOME from tb_funcionario a
    where a.id_supervisor = @idsupervisor

    Ela já esta trabalhando com o conceito de uma query parametrizada e dinâmica dentro da aplicação, ao meu ver, basta você mudar a condição no Where para algo similar a este exemplo:

    select A.NUM_FRE, A.NOME from tb_funcionario a
    where a.nome like '%'+@nomefuncionario+'%'

    No caso o parâmetro ou variável @nomefuncionario vai armazenar ou receber justamente o que sendo obtido no textbox que você digita o nome do funcionário.

    Se a sua linguagem de programação permitir, você pode declarar diretamente na sua query o nome do textbox como parâmetro, algo similar a este exemplo:

    select A.NUM_FRE, A.NOME from tb_funcionario a
    where a.nome like '%'+textbox.text+'%'

    Provavelmente esta query será transcrita internamente pelo SQL Server com base na instrução enviada por sua aplicação como uma Ad-hoc query e a mesma será processada e retornada.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta diego.lk sexta-feira, 13 de setembro de 2019 00:18
    quarta-feira, 11 de setembro de 2019 12:42
  • A seguinte query faz o que eu gostaria mas teria que se buscar pelo id do supervisor, coisa que não quero. Quero retornar esses mesmos valores porém buscando pelo nome do supervisor.

    Diego, se @VALOR contém o nome completo de funcionário que é supervisor e que foi selecionado pelo usuário, então experimente

    -- código #3 v2
    SELECT colunas funcionário
      from TB_FUNCIONARIO
      where id_supervisor = (SELECT id_funcionario 
                               from TB_FUNCIONARIO
                               where upper (NOME) like @VALOR
    and SUPERVISOR = 'S');

    O código acima considera que a coluna que identifica cada funcionário é a id_funcionario; altere para o nome correto. Em colunas funcionário deve-se informar as colunas dos vendedores que a consulta deve retornar.

    Considera ainda o que foi informado em "existe uma coluna chamada id supervisor, e é nela que é feito o vínculo do vendedor com o supervisor. todo vendedor deve possuir algum ID nessa coluna id_supervisor, que corresponde ao id do seu supervisor".

    O código #3 primeiro pesquisa pelo nome do supervisor, conforme você solicitou, e após encontra os vendedores que são supervisionados por ele.

    ---

    Se você retirar % da montagem de @VALOR, pode-se então alterar o código #3 para utilizar o operador = no lugar de LIKE. É mais eficiente, já que se tem o nome completo.

    A pesquisa por nome completo somente é correta caso não existam homônimos.

    ---

    Dúvida: pode existir supervisor de supervisor?

     



    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como Resposta diego.lk sexta-feira, 13 de setembro de 2019 00:18
    • Editado José Diz quinta-feira, 10 de outubro de 2019 09:10
    quarta-feira, 11 de setembro de 2019 13:12
  • Obrigado a ajuda de todos. Consegui resolver !
    sexta-feira, 13 de setembro de 2019 01:33
  • Obrigado a ajuda de todos. Consegui resolver !

    Diego,

    Nós que agradecemos, conte conosco.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 13 de setembro de 2019 12:23