View Full Version : [SQL] Comparações com Null


stradale
20-05-2008, 12:03
Viva o/

Tenho 2 tabelas:

Pessoa
- idPessoa
- nomePessoa
- idTipo

Tipo
- idTipo
- nomeTipo

A 1ª tem:
1, Manel, 1
2, Maria, (null)
3, Joaquim, 2

E a 2ª:
1, Professor
2, Aluno

O problema está nesta query:
Select nomePessoa, nomeTipo
From Pessoa, Tipo
Where Pessoa.idTipo = Tipo.idTipo
And Pessoa.idPessoa < 50

Esta query para a Maria (2) vai dar, claro, falso. E já devem estar a ver o meu problema...

Um Union sei que funciona (1º faço para os idTipo IS NULL, em seguida para os restantes), mas é mesmo isto que devo utilizar ou há uma maneira melhor? É que essas tabelas são apenas um exemplo... na realidade são 4, e estar a fazer Unions para todos os casos vai resultar numa query de dezenas de linhas :s

Alterar os dados está fora de questão.

theforbidden1
20-05-2008, 13:00
O problema está em não saberes o que queres, ou não saberes expressar correctamente o que queres
Select nomePessoa, nomeTipo From Pessoa p, Tipo t
Where (p.idTipo = t.idTipo or p.idTipo is NULL)
And p.idPessoa = 'x'experimenta lá assim a ver se dá o que tu queres

E isso de resultar numa query de dezenas de linhas não quer dizer nada, a query andes de ser executada vai primeiro ao code optimizer.

nota: se criares umas views esses dezenas de linhas podem ser "eliminadas"

stradale
20-05-2008, 14:40
O problema está em não saberes o que queres, ou não saberes expressar correctamente o que queres
Select nomePessoa, nomeTipo From Pessoa p, Tipo t
Where (p.idTipo = t.idTipo or p.idTipo is NULL)
And p.idPessoa = 'x'experimenta lá assim a ver se dá o que tu queres
Retorna isto (2 linhas):

Maria, Professor
Maria, Aluno

em vez do pretendido (1 linha):

Maria, null

E isso de resultar numa query de dezenas de linhas não quer dizer nada, a query andes de ser executada vai primeiro ao code optimizer.

nota: se criares umas views esses dezenas de linhas podem ser "eliminadas"
Não posso criar vistas.

Karski
20-05-2008, 14:43
podes usar a função NVL

NVL(id_tipo, 'valor_default')


Se o teu problema é juntar as tabelas usas outer joins

stradale
20-05-2008, 14:56
podes usar a função NVL

NVL(id_tipo, 'valor_default')


Se o teu problema é juntar as tabelas usas outer joins
Resolvido com Outer joins!

NVL também não dá. É uma query para ser utilizada em várias bases de dados, nem todas são Oracle.