Jump to content
FabianoSouza

Escolher coluna em cláusula WHERE

Recommended Posts

Quero fazer um select que me permita escolher em qual coluna a pesquisa deverá ocorrer.

Na minha cabeça a coisa deveria ser com essa lógica:

 

DECLARE 
@strPesquisa varchar(60)
, @colunaPesquisa varchar(60)

 

SET @colunaPesquisa = 'nome'
SET @strPesquisa = 'Al Pacino'

 

SELECT * FROM minhaTabela WHERE
@colunaPesquisa LIKE '%'+ @strPesquisa +'%'

 

Claro que essa sintaxe não funciona. Mas a lógica seria essa.

 

Com crio isso?

 

Grato.

Share this post


Link to post
Share on other sites

Cara, isso me ajudou bastante. Agradeço bastante.

Pelo que entendi, para atingir meu  objetivo terei que montar meu SELECT basicamente fazendo concatenações (colocando tudo dentro de uma variável para depois executar com uma query propriamente dito). Essa "técnica" deixa a programação uma salada (pois minha consulta é grande), mas vai funcionar.


Mas não conseguir fazer funcionar usando VIEW (como no exemplo do link).


 

******* isso funciona
set @view = 'dbo.minhaTab'
set @coluna = 'nome'
set @variavel = 'Leo'

SET @sql = 'select nome from ' + @view + ' where ' + @coluna + ' LIKE ' + '''%'+@variavel+'%''' 
EXEC (@sql)

******** isso não funciona (chamando uma view, ao invés de tabela)
set @view = 'dbo.minhaView'
set @coluna = 'nome'
set @variavel = 'Leo'

SET @sql = 'select nome from ' + @view + ' where ' + @coluna + ' LIKE ' + '''%'+@variavel+'%''' 
EXEC (@sql)

Usando a função PRINT aparece:

select * from dbo.view_selMailing where nome LIKE '%Leo%'

 

Diante disso penso que o certo seria:
1) Recuperar o resultado na view (a consulta "bruta").

2) Colocar esse resultado numa tabela temporária
3) Executar a consulta dinâmica com base na tabela temporária.

Acha uma boa abordagem? Acha que a performance pode ficar muito ruim?
Tenho cera de 10K registros.

 

Grato.

 

 

 

 

Share this post


Link to post
Share on other sites

Não creio precisar de views , bastaria montar os slqs dinâmicos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By osmarindy
      Boa noite Pessoal.
      Estou com o seguinte problema. Tenho duas tabelas principais "tblProjeto" e "tblItensProjeto", tenho que selecionar o projeto (tblProjeto) cujo o item 19 (tblItensProjeto) já esteja concluído (status 5) e que o item 15 (tblItensProjeto) não esteja concluído (status 5) e nem cancelado (status 4).
      Tenho o seguinte código:
      SELECT p.nmProjeto, l.nmLocalidade, f.usuario, r.nmRequisitante, p.dtSolicitacao,p.dtPrevisaoEntrega, s.nmStatus FROM tblProjeto as p inner join tblItensProjeto as i on i.idProjeto = p.idProjeto inner join tblLocalidade as l on l.idLocalidade = p.idLocalidade inner join tblFuncionario as f on f.idFuncionario = p.idFuncionario inner join tblRequisitante as r on r.idRequisitante = p.idRequisitante inner join tblStatusProj as s on s.idStatus = i.idStatus where (i.idAtividade = 19 and i.idStatus= 5 ) and (i.idAtividade = 15 and (i.idStatus <> 5 and i.idStatus <> 4))
      Se executo um  filtro de cada vez (where i.idAtividade = 19 and i.idStatus= 5 ) ou (i.idAtividade = 15 and (i.idStatus <> 5 and i.idStatus <> 4)) eles trazem resultados, mas quando deixo os dois filtros não funciona.
      Possuo 5 projetos que estão com a atividade 19 concluída e atividade 15 pendente. mas, não consigo com esse select trazer a informação. Alguém sabe como posso resolver?
    • By SAS Junior
      Olá, sou novo aqui e em SQL Server, estou com um problema para buscar um resultado. 
      Caso hoje seja segunda, trazer as instalações dos últimos 3 dias (sexta, sábado e domingo), caso não seja, trazer só os de ontem, tentei da forma abaixo e muitas outras e não consegui, desde já agradeço.    
      SELECT codigoCliente AS [CÓD], CpfCnpj AS [CPF/CNPJ] ,NomeFantasia as [NOME FANTASIA] ,UPPER(NomeContato) as [NOME DE CONTATO] ,CASE WHEN CLI.DDDCelular IS NULL THEN 'NÃO TEM' ELSE DDDCelular END AS [DDD CEL] ,CASE WHEN Celular IS NULL THEN 'NÃO TEM' ELSE Celular END AS CELULAR ,CASE WHEN DDDTelefone IS NULL THEN 'NÃO TEM' ELSE DDDTelefone END AS [DDD TEL] ,CASE WHEN Telefone IS NULL THEN 'NÃO TEM' ELSE Telefone END AS TELEFONE ,DataInstalacao AS [INSTALAÇÃO] ,DATEPART(weekday,DataInstalacao) as [DIASEMANA] ,UPPER(Departamento) AS [DEPTO CAD] ,upper(UsuarioCadastro) as [CADASTRADO POR] ,CASE WHEN UPPER(EMAIL) IS NULL THEN 'NÃO TEM EMAIL' ELSE UPPER(EMAIL) END AS EMAIL FROM CLIENTE WHERE (CASE WHEN (DATEPART(weekday,GETDATE()) = '2' THEN DATEPART(DAY, DataInstalacao) >= DATEPART(DAY, GETDATE()-3) ELSE DATEPART(DAY, DataInstalacao) = DATEPART(DAY, GETDATE()-1) END) AND MONTH(DataInstalacao) = MONTH(GETDATE()) AND YEAR(DataInstalacao) = YEAR(GETDATE()) AND Situacao = 'MAQUINA INSTALADA'  
    • By peterstefan
      Olá, estou com uma query aqui e preciso pegar de 2 campos diferentes os dados diferente de 0,  mais quanto tento no AND ele somente traz um resultado, o OR ele traz um dos campos com o valor 0, teria alguma forma de pegar os dados diferente de 0 dos dois campus?
      preciso pegar o idOrganizador diferente de 0 e o idPiloto diferente de 0 
       
      SELECT * FROM boletos WHERE proc = 0 AND idOrganizador !='0' AND idPiloto ='0';  
    • By GGM
      Pessoal, é o seguinte.. Tenho a seguinte query, que está funcionando perfeitamente:
       
      SELECT (SELECT SUM(`quantidade_erros`) FROM erro WHERE `fk_id_questionario` = 1 AND `fk_id_turma` = 1) AS alfabeto, (SELECT SUM(`quantidade_erros`) FROM erro WHERE `fk_id_questionario` = 5 AND `fk_id_turma` = 1) AS cores FROM erro WHERE `fk_id_turma` = 1 GROUP BY `fk_id_turma`  

       
      O que acontece é que eu não terei controle sobre os registros contidos na coluna fk_id_questionario, desta forma não sei como proceder para fazer a comparação `fk_id_questionario` = "valorQuePossaEstarContidoNessaColuna".
       
      Alguma dica?
    • By GGM
      Pessoal, é o seguinte.. Tenho a seguinte query, que está funcionando perfeitamente:
       
      SELECT (SELECT SUM(`quantidade_erros`) FROM erro WHERE `fk_id_questionario` = 1 AND `fk_id_turma` = 1) AS alfabeto,
      (SELECT SUM(`quantidade_erros`) FROM erro WHERE `fk_id_questionario` = 5 AND `fk_id_turma` = 1) AS cores FROM erro WHERE
      `fk_id_turma` = 1 GROUP BY `fk_id_turma`
       

       
      O que acontece é que eu não terei controle sobre os registros contidos na coluna fk_id_questionario, desta forma não sei como proceder para fazer a comparação `fk_id_questionario` = "valorQuePossaEstarContidoNessaColuna".
       
      Alguma dica?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.