• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

10 mensagens neste tópico

Boa tarde.

Estou com uma pequena dúvida.

É possivel dentro de um sql querie colocar uma condição? Gostaria que a querie fosse realizada dependendo da pesquisa efectuada género: se o campo xpo não for nulo a secção WHERE ser de uma maneira, caso contrário, ser de outra.

Sei que isto deve de estar totalmente errado mas é só para dar uma ideia do que eu gostaria de alcançar:

pesres.Source = "SELECT * FROM dbo.ib JOIN dbo.im ON dbo.ib.ibno = dbo.im.ibno WHERE IF dbo.ib.u_tipologi IS NOT NULL THEN  dbo.ib.u_tipologi between '" + Replace(pesres__tipo1, "'", "''") + "' and '" + Replace(pesres__tipo2, "'", "''") + "' AND END IF; dbo.ib.u_distrito LIKE '%" + Replace(pesres__distrito, "'", "''") + "%' 

Agradeço desde já a vossa atenção.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei se percebi, queres condicionar a clausulá WHERE? ou queres fazer duas queries diferentes consoante o valor de um campo?

Se for para condicionar a clausula WHERE não podes simplesmente combinar condições?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou a utilizar SQL, e sim, quero condicionar a cláusula WHERE =)

Vou tentar explicar melhor o meu problema.

Na pesquisa que se faz podemos definir a tipologia ou não mediante o tipo de imóvel que se escolha. Se for imóvel tipo x ou y podemos escolher tipologias, o resto de tipos de imóveis tem esse mesmo valor nulo.

Traduzindo para base de dados, na coluna tipologia só aparecem valores nos imóveis que pertençam ao tipo x e y, os restantes tem os campos dessa coluna vazios.

O que acontece é que quando se faz pesquisa a esses tipos de imóveis cujo campo na coluna tipologia se encontra vazia, não aparece resultado. Como podem verificar na minha querie eu utilizei um BETWEEN:

dbo.ib.u_tipologi between '" + Replace(pesres__tipo1, "'", "''") + "' and '" + Replace(pesres__tipo2, "'", "''") + "'

que só é aplicada quando se pesquisa por exemplo: Tipo1= T1 e Tipo2 = T3, ou seja, se pesquisar por Tipo1 = null e Tipo2 = null, não vai haver resultados.

Espero ter conseguido explicar melhor o meu dilema ^^'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Espero ter conseguido explicar melhor o meu dilema ^^'

Nops  B)

Mas se percebi em condições (pouco provavel) queres algo do genero:

( Select *
  From tabela
  Where campoTipologia is Null
) Union (
  Select *
  From tabela
  Where campoTipologia is not Null
     And campoTipulogia between condicaoA and condicaoB
)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi metade do que disseste e a outra metade está um pouco enevoada B), desculpa mas sou muito lento B)

Vamos ver se consigo entender. Tens uma tabela com NULLs num dos campos, queres pesquisar por que valores?

O que acontece é que quando se faz pesquisa a esses tipos de imóveis cujo campo na coluna tipologia se encontra vazia, não aparece resultado.

Quais tipos de imóveis? Os que têm tipologia ou os que não têm tipologia? Se forem os que não têm então é natural B)

Se estou minimamente a ver o que pretendes, o que acho que não é verdade, não teria usado um between...

Bem, não estou a conseguir perceber o que pretendes, que resultados deve a tua query devolver?

Dá-me um exemplo prático se for possível.

É possivel dentro de um sql querie colocar uma condição? Gostaria que a querie fosse realizada dependendo da pesquisa efectuada género: se o campo xpo não for nulo a secção WHERE ser de uma maneira, caso contrário, ser de outra.

Pegando nisto eu faria uma qery cuja clausula WHERE seria algo do género.

WHERE (<campo com nulls> NOT NULL AND <condição caso não seja null>) OR (<condição caso o campo seja null>)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok... Sou naba a explicar isto.. xD

Aqui está o endereço para o exemplo prático ;)

http://www.deprosis.com.pt/clientes/padrao_urbano/main.asp

Como podem verificar temos uma pesquisa rápida, na qual a secção tipologia está desactiva, ou seja, os valores que irão para a querie na página de resultados serão nulos (vazios). Mas se no menu correspondente a Imóveis escolherem "Moradias" ou "Apartamentos" o menu Tipologias fica activo e poderão escolher entre as várias tipologias disponiveis, e assim sendo já passamos valores válidos para a página de resultados (T1, T2, T3...). Se entretanto escolherem uma das outras opções, exemplo "Lojas", o menu Tipologias fica desactivado novamente (porque lojas não se escolhem por tipologias :D muito menos terrenos xD).

Eu de inicio fui naba e não me lembrei desse "pequeno" promenor e por isso na página de resultados fiz a query utilizando o BETWEEN, porque tinha o menu Tipologias activo para todo o tipo de Imóveis. (pesquisar desde T1 a T5) Dai dar erro... As Lojas, Terrenos, Escritórios e Vivendas não aparecem se as pesquisarmos, porque simplesmente não tem tipologias, ou seja, não se enquadram no filtro BETWEEN. Não se pode fazer um BETWEEN entre dois valores nulos =0 tipo:

WHERE dbo.ib.u_tipologi between '" "' and '" "'

Portanto, o que eu gostaria de fazer era o seguinte: Se o tipo de Imóvel escolhido não for do tipo de ter Tipologia, como no caso da "Loja", não haver filtro para tipologia, caso contrário incluir o BETWEEN para podermos filtrar as moradias e apartamentos por tipologias.

Espero que seja desta que compreendam xD

Podem testar uma coisa. Experimentem pesquisar por "Venda "Apartamento" "T2" "T3" "Lisboa" "Todas". Como poderão verificar, temos resultados. Agora tentem "Arrendamento" "Loja" "Lisboa" "Todas". Deveria de aparecer lojas mas devido à querie mal feita são omitidas. T_T

Pelo que vocês já me disseram seria algo assim?

WHERE ... AND (dbo.ib.u_tipologi NOT NULL AND between '" + Replace(pesres__tipo1, "'", "''") + "' and '" + Replace(pesres__tipo2, "'", "''") + "') OR 1 AND ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem a maneira mais facil é gerares a query sql fora e mandares já a parte do where especifico para ocasião.

Se tiver ser mesmo na query, então podes sempre pensar em criar um procedimento na base de dados para isso e passas os 2 campos para o procedimento. No procedimento fazes um IF e mandas para 2 selects distintos conforme se os argumetnos forem null ou não.

Tens também esta query SQL. Não a testei, portanto não garanto que funcione, se é que seja SQL válido...

Select *
From tabela
Where 
  Case
    When campo1 IS NULL And campo2 IS Null Then campoTopologia Is Null
    When campo1 IS Null And campo2 Is Not Null Then campoTopoliga <= campo2
    When campo1 Is Not Null And campo2 Is Null Then campoTopoliga >= campo1
    Else campoTopologia Between campo1 And campo2
  End

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Humm... dado que é um requisito da aplicação a maneira que faria seria colocar o if do lado da aplicação, neste caso na página. Porquê usar apenas uma query? Fazes o if na página consoante o valor da combobox e executas a query que se adaptar ao caso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

EDIT: Já resolvi o problema. Após retirar a opção de Show friendly HTTP Error Messages do Browser pude verificar ao promenor o problema, e depois foi só fazer as contas... 1+1=2 e voilá! Caso resolvido. Obrigada pelo vosso suporte =)

Heis o código que estou a utilizar. Poderá servir de referência para alguém que possa vir a ter o mesmo problema que eu.^^

<%
Dim pesres
Dim pesres_numRows

Set pesres = Server.CreateObject("ADODB.Recordset")
pesres.ActiveConnection = MM_aspvbPHC_STRING

If (Request.QueryString("Tipo01")  <> "") Then 

pesres.Source = "SELECT *  FROM dbo.ib JOIN dbo.im ON dbo.ib.ibno = dbo.im.ibno  WHERE dbo.ib.u_distrito LIKE '%" + Replace(pesres__distrito, "'", "''") + "%' AND dbo.ib.situacao LIKE '%" + Replace(pesres__negocio, "'", "''") + "%' AND dbo.ib.ibtipo LIKE '%" + Replace(pesres__imovel, "'", "''") + "%' AND dbo.ib.u_concelho LIKE '%" + Replace(pesres__concelho, "'", "''") + "%' AND dbo.im.princ='true' AND dbo.ib.u_dispint=1 AND dbo.ib.u_tipologi between '" + Replace(pesres__tipo1, "'", "''") + "' and '" + Replace(pesres__tipo2, "'", "''") + "'  AND dbo.ib.u_freg LIKE '%" + Replace(pesres__freguesia, "'", "''") + "%' AND dbo.ib.u_climat LIKE '%" + Replace(pesres__clima, "'", "''") + "%' AND dbo.ib.u_eleva LIKE '%" + Replace(pesres__elevador, "'", "''") + "%' AND dbo.ib.u_jardim LIKE '%" + Replace(pesres__jardim, "'", "''") + "%' AND dbo.ib.u_garagem LIKE '%" + Replace(pesres__garagem, "'", "''") + "%' AND dbo.ib.u_piscina LIKE '%" + Replace(pesres__piscina, "'", "''") + "%' AND dbo.ib.u_aspcent LIKE '%" + Replace(pesres__aspiracao, "'", "''") + "%' AND dbo.ib.u_sonamb LIKE '%" + Replace(pesres__som, "'", "''") + "%' AND dbo.ib.u_arrecad LIKE '%" + Replace(pesres__arrecadacao, "'", "''") + "%'  ORDER BY " + Replace(pesres__MM_sort, "'", "''") + " " + Replace(pesres__MM_order, "'", "''") + ""

Else

pesres.Source = "SELECT *  FROM dbo.ib JOIN dbo.im ON dbo.ib.ibno = dbo.im.ibno  WHERE dbo.ib.u_distrito LIKE '%" + Replace(pesres__distrito, "'", "''") + "%' AND dbo.ib.situacao LIKE '%" + Replace(pesres__negocio, "'", "''") + "%' AND dbo.ib.ibtipo LIKE '%" + Replace(pesres__imovel, "'", "''") + "%' AND dbo.ib.u_concelho LIKE '%" + Replace(pesres__concelho, "'", "''") + "%' AND dbo.im.princ='true' AND dbo.ib.u_dispint=1 AND dbo.ib.u_freg LIKE '%" + Replace(pesres__freguesia, "'", "''") + "%' AND dbo.ib.u_climat LIKE '%" + Replace(pesres__clima, "'", "''") + "%' AND dbo.ib.u_eleva LIKE '%" + Replace(pesres__elevador, "'", "''") + "%' AND dbo.ib.u_jardim LIKE '%" + Replace(pesres__jardim, "'", "''") + "%' AND dbo.ib.u_garagem LIKE '%" + Replace(pesres__garagem, "'", "''") + "%' AND dbo.ib.u_piscina LIKE '%" + Replace(pesres__piscina, "'", "''") + "%' AND dbo.ib.u_aspcent LIKE '%" + Replace(pesres__aspiracao, "'", "''") + "%' AND dbo.ib.u_sonamb LIKE '%" + Replace(pesres__som, "'", "''") + "%' AND dbo.ib.u_arrecad LIKE '%" + Replace(pesres__arrecadacao, "'", "''") + "%'  ORDER BY " + Replace(pesres__MM_sort, "'", "''") + " " + Replace(pesres__MM_order, "'", "''") + ""
END IF

pesres.CursorType = 0
pesres.CursorLocation = 2
pesres.LockType = 1
pesres.Open()

pesres_numRows = 0
%>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora