WHERE somente se condição for verdadeira

Bom dia pessoal, tenho a seguinte select de exemplo

SELECT cartao.Nome
	cartao.NSU
	cartao.TRANSACAO
	cartao.ABERTO
	cartao.CARTAO_HASH
	relatorio.CARTAO_CRIPTOGRAFADO
	relatorio.CLIENTE

where relatorio.CARTAO_CRIPTOGRAFADO = cartao.CARTAO_HASH

and
	relatorio.DATA < (SELECT DT_MOV from TRANSACOES where CD_TIP_ARQUIVO=1);

Eu preciso colocar um if antes do where, pois quero que a clausula WHERE funcione apenas se meu IF der false, mas não estou conseguindo, quero algo mais ou menos assim:

SELECT cartao.Nome
    	cartao.NSU
    	cartao.TRANSACAO
    	cartao.ABERTO
    	cartao.CARTAO_HASH
    	relatorio.CARTAO_CRIPTOGRAFADO
    	relatorio.CLIENTE


IF cartao.CARTAO_ABERTO != NULL THEN
    where relatorio.CARTAO_CRIPTOGRAFADO = cartao.CARTAO_HASH
END IF
    and
    	relatorio.DATA < (SELECT DT_MOV from TRANSACOES where CD_TIP_ARQUIVO=1);

Quero que ele caia no WHERE somente se o cartao.CARTAO_ABERTO fora diferente de nulo.

Exemplo:

SELECT
  ... 
FROM
  TABELA
WHERE 
  ( 
    CAMPO IS NULL 
    AND ..condicao quando nulo..
  )
  OR     
  (
    ..outras condicoes..
     CAMPO IS NOT NULL AND ...
  )

Parece-me que o que tu queres é um left join

SELECT cartao.Nome
cartao.NSU
cartao.TRANSACAO
cartao.ABERTO
cartao.CARTAO_HASH
relatorio.CARTAO_CRIPTOGRAFADO
relatorio.CLIENTE
from relatorio left join cartao on relatorio.CARTAO_CRIPTOGRAFADO = cartao.CARTAO_HASH and cartao.cartao_aberto is not null
where relatorio.DATA < (SELECT DT_MOV from TRANSACOES where CD_TIP_ARQUIVO=1);
1 curtida

Po cara, deu certo, muito obrigado, isso me lembra que preciso estudar mais PLSQL, valeu, abraços! Obrigado também @javaflex !