Autore Topic: Problema SQL.  (Letto 1815 volte)

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Problema SQL.
« il: 09 Marzo 2008, 23:05:51 »
Ho un DB con una tabella composta da vari campi, con il mio programma Gambas questi campi non vengono popolati tutti insieme ma in due fasi diverse e quindi alcuni rimangono vuoti, sono settati come NULL, fin qui tutto ok. Quando eseguo una SELECT ho necessità di includerli tutti anche quelli vuoti.
Vi faccio un esempio:

SELECT campo1, campo2, Tabella2.id_Tabella1, campo4 FROM Tabella2
WHERE campo1 = '1234'
AND Tabella2.id_Tabella1 = Tabella1.id_Tabella1

se il campo id_Tabella1 della Tabella2 è vuoto mi restituisce come risultato "un insieme vuoto (zero righe)" come posso fare?

Spero di essermi spiegato.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Problema SQL.
« Risposta #1 il: 09 Marzo 2008, 23:50:07 »
personalmente io ho risolto un problema simile inserendo nel database al posto di un valore nullo un valore di riferimento per esempio "/" che durante la fase di immissione dati viene aggiunto in un record vuoto ed in fase di estrapolazione mi indica che il record è vuoto.
spero di essere stato chiaro

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Problema SQL.
« Risposta #2 il: 10 Marzo 2008, 00:28:44 »
Penso di averti capito, in fase di inserimento dovrei condizionare l'istruzione INSERT in modo che vengano inseriti nella tabella dei caratteri laddove i campi in Gambas risultino vuoti.
Sinceramente ci avevo pensato ma mi complica notevolmente il programma sono circa trenta campi in una prima fase poi diminuiscono.
Altre idee?
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Problema SQL.
« Risposta #3 il: 10 Marzo 2008, 17:52:22 »
Che database è ?
postgresql, mysql, sqlite...

eventualmente puoi farti una funzione di conversione da valori null a, magari, stringa vuota...

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Problema SQL.
« Risposta #4 il: 10 Marzo 2008, 22:22:10 »
Il DB che uso è Mysql.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Problema SQL.
« Risposta #5 il: 11 Marzo 2008, 01:38:57 »
Prova a modificare la query, in modo che per valori null ti ritorni magari una stringa vuota; in questo caso ti resta più facile gestirla.
Attento con le join nelle query tra più tabelle, in caso di null il risultato può non essere congruo.
Adesso non ricordo se in MySql esiste, ma prova a leggere se esiste già una funzione del tipo NVL() come in Oracle, in casi estremi puoi costruirtela tu stesso. La funzione non fà altro che ritornare un valore di default nel caso un sia nullo; la funzione accetta come primo parametro il campo da testare, il secondo parametro è il valore di default eventuale; nel caso il campo sia null, ritorna il valore di default, altrimenti l'effettivo dato contenuto nel campo. Nella query non fai altro che chiamare la funzione, anche se fastidioso scriverla su svariati campi, esempio:

SELECT NVL(campo1, ""), NVL(campo2, 0), NVL(campo3, Now) from tabella;

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Problema SQL.
« Risposta #6 il: 23 Marzo 2008, 22:45:51 »
Risolto.
Con il consiglio datomi da md9327 ho fatto una ricerca è ho trovato la soluzione,
anche MySQL ha dei controlli per i campi che all'interno di una tabella possono per vari motivi essere 'NULL' ma se richiamati da una query restituiscono una stringa vuota.
Le istruzioni che permettono il controllo in MySQL dei campi 'NULL' sono:
LEFT JOIN
RIGHT JOIN

Facciamo un esempio:
Tabella1 (t1) composta da quattro campi:
t1.id_t1
t1.campo1
t1.id_t2 (campo id Tabella2)
t1.id_t3 (campo id Tabella3)

SELECT t1.id_t1, t1.campo1, t2.campo_t2, t3.campo_t3
FROM t1
LEFT JOIN t2 ON t1.id_t2 = t2.id_t2
LEFT JOIN t3 ON t1.id_t3 = t3.id_t3
WHERE t1.id_t1 = '1234'

se uno dei campi id (t1.id_t2, t1.id_t3) o entrambi delle tabella t1 risultassero NULL comunque la query restituirà un risultato valido.
Spero di essere stato chiaro. :-D
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Problema SQL.
« Risposta #7 il: 24 Marzo 2008, 01:54:18 »
Non avevo capito si trattasse di collegare più tabelle, altrimenti risolvevamo subito.
I comandi che hai trovato sono comandi standard SQL-92, e permettono di ritornare i record della tabella principale anche se non trova corrispondenti nelle tabelle linkate.

Lo standard indica con LEFT/RIGHT/FULL OUTHER JOIN come comandi per queste situazioni; il link si effettuat tramite dei campi chiave.

MySQL e PostgreSQL usano questa sintassi, in Oracle per esempio è possibile inserire un "(+)" al fianco della tabella/campo che può NON restiture un risultato, facilitando il compito a chi scrive la query. In questo caso i comandi JOIN non vengono inseriti, e le tabelle possono essere inserite nella FROM senza problemi, e i campi tutti nella stessa WHERE.
Ovviamente questo tipo di sintassi è fuori standard, per cui è meglio usare quella che hai trovato.

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Problema SQL.
« Risposta #8 il: 24 Marzo 2008, 15:34:57 »
Citazione

md9327 ha scritto:
Non avevo capito si trattasse di collegare più tabelle, altrimenti risolvevamo subito.
I comandi che hai trovato sono comandi standard SQL-92, e permettono di ritornare i record della tabella principale anche se non trova corrispondenti nelle tabelle linkate.


Mi scuso, non sempre riesco a spiegare con facilità ciò che voglio chiedere ho difficoltà a volte a tradurre in parole ciò che vorrei fare in pratica, comunque il tuo input mi è servito a risolvere il problema.
Grazie.  :ciao:

P.S.: Per quanto riguarda FULL OUTHER JOIN mi sbaglio ho MySQL non lo prevede?
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Problema SQL.
« Risposta #9 il: 25 Marzo 2008, 14:19:30 »
E' probabile, anche perchè è previsto dallo standard, ma in pratica serve a poco.

Bye