select case

Delphi

16/01/2008

ola gostaria de saber se é possivel fazer um select case com instrucao sql

por exemplo

select case of

0 : faz esse

1 : outro select


e assim por diante.

se alguem tiver um exemplo agradeco.

vlw


Ciotti

Ciotti

Curtidas 0

Respostas

Djjunior

Djjunior

16/01/2008

select case when campo = 1 then "a"
                 when campo = 2 then "b"
          else "?" end
from tabela 


Funcina em SQL / Oracle (me parece que a partir do 9

O Oracle tb tem o decode

decode(campo, valor, verdadeiro, falso)
ou seja:
Decode(campo, 1, ´a´, 2, ´b´, ´?´)


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

16/01/2008

Colega,

Sim, veja o exemplo:

select matricula,
case unidade 
         when 1 then ´Sul´ 
         when 2 then ´Norte´
         when 3 then ´Taguatinga´
        end Unidade
from tbInfoEscolares



GOSTEI 0
Ciotti

Ciotti

16/01/2008

ola gente valew pela dica mas acho que nao me expressei bem,estou usando um componete chamado group onde dentro dele criamos os index
por exemplo

id
cpf
razao_social

nesse caso gostaria de saber se quando eu selecionar o id ele so faz pesquisa com id , cpf a mesma coisa e assim vai.

consigo fazer de outras formas mas tentei usando case nao consegui.

seria assim mais ou menos assim

select case componente.index of

0: faz a pesquisa de id

1: faz pesquisa cpf

2 : faz pesquisa razao social


tipo em fez de ficar usando if uso case.

vlw gente

case


GOSTEI 0
Djjunior

Djjunior

16/01/2008

você poderia usar algo do tipo:

where (campo1 = :param1 or :param1 = 0)
  and (campo2 = :param2 or :param2 = 0)
  and (campo3 = :param3 or :param3 = 0)


só que ñ recomento esse tipo de código, pq com isso o banco deixa de usar os indices e passa a fazer fullScan na tabela, mas, se as tabelas forem pequenas tudo bem. :twisted:


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

16/01/2008

Colega,

Não estou certo de ter compreendido ainda, mas:

function TForm1.Pesquisa(Tipo: Integer; Argumento: Variant): string;
begin
case Tipo of
  1: Result := ´Select * from xTabela where codigo = ´ + VarToStr(Argumento);
    2: Result := ´Select * from xTabela where cpf = ´ + QuotedStr(Argumento);
    3: Result := ´Select * from xTabela where razao like´ + QuotedStr(´¬´+Argumento);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage( Pesquisa( rgCriterio.ItemIndex+1, ´111222333777´));
end;



GOSTEI 0
Djjunior

Djjunior

16/01/2008

cuidado com códigos do tipo:
´Select * from xTabela where codigo = ´ + edt.text


Isso gera furo de segurança, além de não permitir que o seu SGDB utiliza cache.

prefira sempre usar parmetros em suas querys


GOSTEI 0
Pestana_

Pestana_

16/01/2008

cuidado com códigos do tipo:
´Select * from xTabela where codigo = ´ + edt.text
Isso gera furo de segurança, além de não permitir que o seu SGDB utiliza cache. prefira sempre usar parmetros em suas querys


Ola djjunior, você poderia explicar porque gera furos de segurança?


Obrigado pela atenção!


GOSTEI 0
Djjunior

Djjunior

16/01/2008

sql Inject (se não me engano é assim que se chama)

se alguem rodar um sqlMonitor e ver que suas querys são deste tipo ele pode alterar o conteúdo do seu edit para algo do tipo:

´1 or 0 = 0´

de forma que sua query que era pra ser
´Select * from xTabela where codigo = 1


vai ficar
Select * from xTabela where codigo = 1 or 0 = 0 


e em vez de trazer somente um registro ele irá trazer todos


GOSTEI 0
Pestana_

Pestana_

16/01/2008

sql Inject (se não me engano é assim que se chama) se alguem rodar um sqlMonitor e ver que suas querys são deste tipo ele pode alterar o conteúdo do seu edit para algo do tipo: ´1 or 0 = 0´ de forma que sua query que era pra ser
´Select * from xTabela where codigo = 1
vai ficar
Select * from xTabela where codigo = 1 or 0 = 0 
e em vez de trazer somente um registro ele irá trazer todos


[b:41af96233a]djjunior,[/b:41af96233a] Obrigado por responder!

valeu mesmo por essa dica, eu não tinha nem pensado nisso, preciso rever meus códigos. :lol:

Abraços,
Pestana.


GOSTEI 0
POSTAR