Logo Hardware.com.br
renatamiyagusku
renatamiyagu... Membro Junior Registrado
102 Mensagens 0 Curtidas

MS SQL/Oracle X PostgreSQL

#1 Por renatamiyagu... 19/11/2002 - 13:26
Oi pessoal... estou com um problema aqui.

Quem desenvolve queries no MS SQL e no Oracle sabem que existe um tipo de operador que torna não-obrigatória as condições do WHERE. No MS SQL é o "*" e no Oracle basta usar "(+)" do lado em que vc deseja que a condição não seja necessariamente obrigatória.
Gostaria de saber se há algo parecido no PostgreSQL. Estou presa numa query onde uso FULL OUTER JOIN ligando 3 tabelas. Qdo não se usa condições no WHERE, ele funciona direitinho. Mas no meu caso, uma das condições where compara um campo com um parâmetro passado na chamada da function. Como esse valor nem sempre será encontrado no campo (mas mesmo assim preciso retornar a linha), a condição é negada e o select não retorna nada.

Alguém poderia me ajudar???

Obrigada desde já...

Renata
renatamiyagusku
renatamiyagu... Membro Junior Registrado
102 Mensagens 0 Curtidas
#3 Por renatamiyagu...
19/11/2002 - 14:05
Oi! A consulta é a seguinte:

SELECT ht.dt_geracao_arquivo AS "01_Data_Geracao_Arquivo",
mpa.dt_movimento AS "02_Data_Geracao",
SUM(mpa.vl_repasse) AS "03_Valor_Geracao",
lp.dt_lancamento AS "04_Data_Extrato",
SUM(lp.vl_lancamento) AS "05_Valor_Extrato",
SUM(mpa.vl_repasse - lp.vl_lancamento)AS "06_Diferenca",
FROM arf_movimento_prov_arrec mpa LEFT OUTER JOIN arf_ht_arrec_ic ht ON (mpa.id_ht_arrec_ic = ht.id_ht_arrec_ic) FULL OUTER JOIN arf_lancamento_prov lp ON (ht.prov_cd_cpfcgc = lp.prov_cd_cpfcgc)
WHERE ht.prov_cd_cpfcgc = 11111111111111::numeric
AND ht.tp_a_prestacao_contas <> 1::numeric
AND ht.dt_geracao_arquivo >= TO_TIMESTAMP('13/11/2000 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND ht.dt_geracao_arquivo <= TO_TIMESTAMP('14/11/2002 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND mpa.tp_movimento = 0::numeric
AND lp.prov_cd_cpfcgc = 11111111111111::numeric
AND lp.tp_lancamento = 0::numeric
AND lp.dt_lancamento >= TO_TIMESTAMP('13/11/2000 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND lp.dt_lancamento <= TO_TIMESTAMP('14/11/2002 00:00:00','DD/MM/YYYY HH24:MI:SS')
GROUP BY "01_Data_Geracao_Arquivo", "02_Data_Geracao", "04_Data_Extrato"
ORDER BY "01_Data_Geracao_Arquivo";


As condições "ht.prov_cd_cpfcgc = 11111111111111::numeric" e "lp.prov_cd_cpfcgc = 11111111111111::numeric" podem ou não ser verdadeiras, e o que pega aí é que as duas tabelas são linkadas por esse campo apenas. Existe algo que torne essas condições não-obrigatórias?
Estou vendo uma outra maneira de fazer isso, usando UNION, mas esse tipo de select é muito lento.
romulo
romulo General de Pijama Registrado
7.4K Mensagens 0 Curtidas
#5 Por romulo
23/11/2002 - 23:33
Oops... Demorei mas dei uma olhada... smile.png

Bem, creio que se você testar a possibilidade de não existência, dará certo, tipo:

WHERE
(ht.prov_cd_cpfcgc = 11111111111111::numeric OR ht.prov_cd_cpfcgc is null)
AND ht.tp_a_prestacao_contas <> 1::numeric
AND ht.dt_geracao_arquivo >= TO_TIMESTAMP('13/11/2000 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND ht.dt_geracao_arquivo <= TO_TIMESTAMP('14/11/2002 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND mpa.tp_movimento = 0::numeric
AND (lp.prov_cd_cpfcgc = 11111111111111::numeric OR lp.prov_cd_cpfcgc is null)
AND lp.tp_lancamento = 0::numeric
AND lp.dt_lancamento >= TO_TIMESTAMP('13/11/2000 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND lp.dt_lancamento <= TO_TIMESTAMP('14/11/2002 00:00:00','DD/MM/YYYY HH24:MI:SS')

Tome cuidado também com a expressão SUM(mpa.vl_repasse - lp.vl_lancamento)AS "06_Diferenca", pois como os dois campos podem ser nulos (ao mesmo tempo ou não), o resultado poderá ser um nulo também, já que qualquer operação matemática realizada com um nulo dá nulo (a não ser que no PostgreSQL seja diferente dos outros BDs).
Minha coleção de jogos (todos originais)
renatamiyagusku
renatamiyagu... Membro Junior Registrado
102 Mensagens 0 Curtidas
#6 Por renatamiyagu...
25/11/2002 - 11:20
Bom dia... smile.png

Haviam alguns outros detalhes do relatório que seria impossível obter em um único select. Acabei optando por fazer inserts em uma tabela temporária e depois o cursor faz um simples select nela. Só assim funcionou.

Sobre os valores nulos, realmente o que vc falou acontece. No PostgreSQL existe um função chamada COALESCE que funciona como o NVL do Oracle.

De qualquer forma, muito obrigada pela ajuda!! Valeu mesmo!

Renata
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal