PDA

View Full Version : problema in sql


luana.neri80
08-06-2003, 22:00
devo selezionare il minimo tra alcune date:

select min(data_di_nascita)
form tabella_pippo
where nome='carlo' and cognome='neri'

data la presenza di condizioni in where la tabella risultato potrebbe essere vuota, come gestisco la cosa?

se nella tabella risultato ci sono almeno 1 data catturo la minima in una stringa, se invece è vuota la tabella?

aiuto!!!

:cry:

matpez
09-06-2003, 02:50
Ma a cosa vuoi applicare questa cosa?

Se ad un linguaggio tipo VB o ASP vericfichi se il nome (per esempio min(data_di_nascita) lo chiami "ciao" ->> min(data_di_nascita) as ciao):

if recorset("ciao") is null then

e via dicendo :)

lombardp
09-06-2003, 16:36
Premetto che non so se ho ben capito la domanda e che non sono esperto dell'argomento, comunque in JSP dopo aver eseguito una query, scrivo sempre un costrutto di questo tipo:


while (rs.next())
{
// Lettura dei risultati della query
// Utilizzo dei valori letti
}


Perché se la query non ritorna niente, il codice non viene eseguito.

fencer2000
09-06-2003, 16:56
Originally posted by "luana.neri80"

devo selezionare il minimo tra alcune date:

select min(data_di_nascita)
form tabella_pippo
where nome='carlo' and cognome='neri'

data la presenza di condizioni in where la tabella risultato potrebbe essere vuota, come gestisco la cosa?

se nella tabella risultato ci sono almeno 1 data catturo la minima in una stringa, se invece è vuota la tabella?

aiuto!!!

:cry:

Se le tabella e' vuota, come dice lombardp il codice non viene eseguito per cui non te ne devi preoccupare. Se vuoi fare una cosa piu' elegante puoi usare la funzione mysql_affected_rows() che restituisce il numero di righe interessate dalla query; se e' maggiore di 0 allora visualizzi la minima data altrimenti un messaggio che dica che non ci sono dati restituiti per quella query.
Ricordati piuttosto di usare un alias nella query..qualcosa del tipo
"SELECT min(data_di_nascita) AS min_date
FROM tabella_pippo
WHERE nome='carlo' AND cognome='neri'" altrimenti non riesci a visualizzarlo. Buon lavoro :)

luana.neri80
09-06-2003, 17:30
se faccio if invece di while invece cambia qualcosa....

fencer2000
09-06-2003, 17:38
Originally posted by "luana.neri80"

se faccio if invece di while invece cambia qualcosa....

Logicamente no, comunque sia nell'uno che nell'altro caso non viene eseguito il codice..pero' con l'if puoi visualizzare un'alternativa, che nel tuo caso sarebbe il messaggio che non e' stato trovato alcun record

cionci
09-06-2003, 18:41
Originally posted by "fencer2000"

Se le tabella e' vuota, come dice lombardp il codice non viene eseguito per cui non te ne devi preoccupare. Se vuoi fare una cosa piu' elegante puoi usare la funzione mysql_affected_rows() che restituisce il numero di righe interessate dalla query; se e' maggiore di 0 allora visualizzi la minima data altrimenti un messaggio che dica che non ci sono dati restituiti per quella query.
Attenzione che non è PHP...e non è nemmeno detto che usi MySQL ;)

luana.neri80
09-06-2003, 18:55
sto parlando di oracle e jsp
con l'if genera un errore se si usa min e la tabella è vuota

cmq penso di aver risolto catturando il valore con getDate, io facevo con getString... :muro:

alphacygni
10-06-2003, 15:57
il problema non e' recuperarla come stringa o come data, semplicemente inizializza la stringa a ""

String data = "";

poi fai

while (rs.next()) {
data = rs.getString("nomecampo");
}

tanto la select min() torna o un record o nessuno...
se non ne ha tornato nessuno la stringa rimane a "" perche' il blocco nel while non viene eseguito
altrimenti viene valorizzata col valore estratto....

cionci
10-06-2003, 16:20
Io non ci capisco niente di JSP, ma non è che rs.next() torna comunque falso ? Se anche c'è un solo record facendo rs.next() raggiunge l'EOF e di conseguenza dovrebbe ritornare falso...

lombardp
10-06-2003, 16:29
Originally posted by "cionci"

Io non ci capisco niente di JSP, ma non è che rs.next() torna comunque falso ? Se anche c'è un solo record facendo rs.next() raggiunge l'EOF e di conseguenza dovrebbe ritornare falso...

E' la stessa cosa che pensai quando vidi usare questo metodo per la prima volta. Poi leggendo il manuale (e anche non mettendolo a causa di una svista), ho scoperto che rs.next() deve essere richiamato anche prima di leggere il primo record.

In altre parole: se c'è solo un record, richiamando rs.next() ci si posiziona su di esso.

cionci
10-06-2003, 16:35
Un po' contorto...non trovi ?

In pratica hanno incluso un test sul EOF e l'istruzioni epr spostarsi sul record successivo nella stessa funzione...

matpez
10-06-2003, 16:54
Originally posted by "cionci"

Un po' contorto...non trovi ?

In pratica hanno incluso un test sul EOF e l'istruzioni epr spostarsi sul record successivo nella stessa funzione...


In effetti...è una cosa che nn ha un gran senso, se nn c'è record fai un bel while not rs.EOF , cosi nn entra nemmeno nel ciclo!!

Va be, ogni linguaggio poi la pensa a modo suo :rolleyes:

lombardp
10-06-2003, 17:01
Originally posted by "cionci"

Un po' contorto...non trovi ?
In pratica hanno incluso un test sul EOF e l'istruzioni epr spostarsi sul record successivo nella stessa funzione...

E' vero che è contorto, ma anche molto pratico, perché puoi letteralmente risparmiarti di verificare EOF a parte. Con while (rs.next()) hai in pratica un loop su tutti i record che funziona anche nel caso di 0 record, perché in tale caso semplicemente non esegue il loop.

Duncan
10-06-2003, 18:37
A me non pare contorto anzi...

giustamente rende l'oggetto con cursore che punta a BOF se c'è almeno un record si sposta sul primo, altrimenti potendo spostare il cursore solo su EOF non entra nemmeno nel ciclo... (opinione personale :sofico: )

probabilmente mi sbaglio, ma la funzine .next() usata in questo modo non rientra tra gli iteratori? (curiosità personale :D )

cionci
10-06-2003, 18:40
Originally posted by "Duncan"

A me non pare contorto anzi...
Contorto il ragionamento che ci sta dietro, ma buona dal punto di vista pratico...