Italian Come impostare query che restituisca per una certa tabella i nomi colonne mai usate?

amorosik

Expert
Licensed User
Allora supponiamo avere tabella ARTICOLI
Composta dai campi CODICE, DESCRIZIONE, PREZZO, COSTO, NOTE, BARCODE
La tabella contiene 228 record
I valori dei campi su campo COSTO e BARCODE non sono mai stati valorizzati su nessuno dei 228 record

La domanda e': come fare una query che restituisca i nomi delle colonne mai usate?
In sostanza, con i dati esempiati sopra, la query deve restituire COSTO, BARCODE
(notare l'uso di aggettivi complessi per descrivere sinteticamente il desiderata)
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Senza stare ad impiccarti cercando di inventare una singola query, crea un funzione (Sub) che lo faccia, eseguendo più query.
Bisogna vedere se la vuoi fare per qualunque tabella gli passi o per una di cui conosci bene la struttura, per sapere sia il tipo dei campi, sia se hanno valori di default o Null.
 

MarcoRome

Expert
Licensed User
Longtime User
SQLITE
SQL:
SELECT IIF(campo0 = '' or campo0 isnull,'sms','') || ' ' || IIF(campo1 = ''  or campo1 isnull,'campo1','') || ' ' || iif(campo2 = ''  or campo2 isnull,'campo2','') as colonne_vuote FROM test
 

LucaMs

Expert
Licensed User
Longtime User
Funziona bene:

1670139204996.png


Più leggibile:
B4X:
    Dim Query As String = _
$"SELECT
    IIF(Codice = '' or Codice isnull, 'Codice', '')
    || ' '
 || IIF(Descrizione = '' or Descrizione isnull, 'Descrizione', '')
    || ' '
 || IIF(Prezzo = '' or Prezzo isnull, 'Prezzo', '')
    || ' '
 || IIF(Costo = '' or Costo isnull, 'Costo', '')
    || ' '
 || IIF(Note = '' or Note isnull, 'Note', '')
    || ' '
 || IIF(Barcode = '' or Barcode isnull, 'Barcode', '')
 
 AS colonne_vuote FROM Articoli"$
 

amorosik

Expert
Licensed User
No
Gli esempi sopra restituiscono una colonna 'colonne_vuote' per tante volte quanti sono i record dentro la tabella
In sostanza si vede, per ogni record, se la colonna indicata nella query sia stata usata oppure no
Non e' questo che soddisfa la richiesta inziale
La query richiesta deve restituire un solo record, con i nomi delle colonne, che in OGNI record della tabella non hanno valore (null o '') su tabella contenente piu' di un record
Forse cosi' ho spiegato meglio
 

LucaMs

Expert
Licensed User
Longtime User
No
Gli esempi sopra restituiscono una colonna 'colonne_vuote' per tante volte quanti sono i record dentro la tabella
In sostanza si vede, per ogni record, se la colonna indicata nella query sia stata usata oppure no
Non e' questo che soddisfa la richiesta inziale
La query richiesta deve restituire un solo record, con i nomi delle colonne, che in OGNI record della tabella non hanno valore (null o '') su tabella contenente piu' di un record
Forse cosi' ho spiegato meglio
Dev'essere perché nella mia prova, per pigrizia, ho inserito a mano solo un record 😁

Se i due neuroni si raffredderanno, dopo quello per cui stavano "lavorando" (si fa per dire, sono perfino più pigri di me), guarderò di nuovo la cosa.

P.S. Che furbo: dovrebbe essere sufficiente aggiungere la clausola LIMIT 1, anche se non ho provato!

P.P.S. Eh no, perché magari ci saranno record con uno o più campi Null, il che non significa che tutto il campo sia vuoto, in tutta la tabella.
(Stranamente, ho duplicato l'unico record che avevo creato e ugualmente mi ha tirato fuori un unico risultato, non due come dicevi).
Edit: eh, proprio per quello, perché i due record sono identici; ma se hanno Null in campi diversi, riporta quel valore colonne_vuote per ognuno).
 
Last edited:

amorosik

Expert
Licensed User
Dev'essere perché nella mia prova, per pigrizia, ho inserito a mano solo un record 😁

Ammazza che pigrizia
Mi spiace per la tua conoscenza approfondita delle tematiche legate allo sviluppo codice, ma questa caratteristica direi che ti fa arruolare dritto dritto nella banda scarsotti come 'expert member'

😇 🤣 😁
 

LucaMs

Expert
Licensed User
Longtime User
Oh, ma scrivi una bella funzione che fai prima, come detto, anziché ammattire tentando di creare una singola query!

B4X:
Dim RecTot As Int = DB.ExecQuerySingleResult("SELECT COUNT(*) FROM Articoli")

Poi, per ogni campo, esegui una query come quella sopra, con l'aggiunta della clau


Mi sono fermato, non appena letto il tuo post appena arrivato.
Sono talmente pigro e scarsotto che mi è passata la voglia di proseguire e venuta quella di dedicarmi ai c. miei 😂
 

amorosik

Expert
Licensed User
Oh, ma scrivi una bella funzione che fai prima, come detto, anziché ammattire tentando di creare una singola query!

Ma quella l'ho gia' fatta
Poi mi e' venuta la curiosita' di capire se si potesse fare con un colpo solo di query sul db
Ma dopo i primi tentativi ho deciso di chiedere aiuto
 

amorosik

Expert
Licensed User
Mi sono fermato, non appena letto il tuo post appena arrivato.
Sono talmente pigro e scarsotto che mi è passata la voglia di proseguire e venuta quella di dedicarmi ai c. miei 😂
Non è la prima volta che critichi a c., scherzando o fingendo di scherzare.
Non meriti aiuti!

Ho usato parole inoffensive, con l'unico intento di far sorridere
Mi scuso sinceramente se quanto ho scritto possa essere stato offensivo
 

amorosik

Expert
Licensed User
Non so che dire, chiunque puo' leggere le parole scritte
Usare l'aggettivo 'pigro' che gia' di per se non mi sembra un'offesa, associato alla ridicola banda scarsotti, associato alle faccine, mi sembra chiaramente una bonaria presa in giro con l'unico scopo di farsi una risata
Se ritieni il mio post offensivo nei tuoi confronti, sono disponibile ad eliminarlo
 

MarcoRome

Expert
Licensed User
Longtime User
No
Gli esempi sopra restituiscono una colonna 'colonne_vuote' per tante volte quanti sono i record dentro la tabella
In sostanza si vede, per ogni record, se la colonna indicata nella query sia stata usata oppure no
Non e' questo che soddisfa la richiesta inziale
La query richiesta deve restituire un solo record, con i nomi delle colonne, che in OGNI record della tabella non hanno valore (null o '') su tabella contenente piu' di un record
Forse cosi' ho spiegato meglio

Allora facciamo un esempio hai la seguente tabella:

1670151531162.png

Dove la colonna campo1 e campo2 in alcuni casi hanno valori NULL mentre il campo3 NO.
Vogliamo riportare il risultato su una singola riga di quali colonne hanno eventuali valori NULL

Utilizzando la seguente query:
SQL:
SELECT GROUP_CONCAT(colonne_vuote) as risultato
FROM (
SELECT 'campo1' as colonne_vuote
FROM test1
WHERE campo1 = '' or campo1 isnull
GROUP BY campo1
UNION
SELECT 'campo2' as colonne_vuote
FROM test1
WHERE campo2 = '' or campo2 isnull
GROUP BY campo2
UNION
SELECT 'campo3' as colonne_vuote
FROM test1 as xx
WHERE campo3 = '' or campo3 isnull
GROUP BY campo3
) as t

Otterrai il seguente risultato:

1670151705389.png
 

MarcoRome

Expert
Licensed User
Longtime User
Per @LucaMs "non te fa rode er cuxo" non ne vale la pena...tra guerre e pestilenze... diamoci gli auguri di un "sereno" Natale.
Ciao a tutti
 

amorosik

Expert
Licensed User
Dove la colonna campo1 e campo2 in alcuni casi hanno valori NULL mentre il campo3 NO.
Vogliamo riportare il risultato su una singola riga di quali colonne hanno eventuali valori NULL

Vogliamo riportare il risultato su una singola riga di quali colonne hanno TUTTI eventuali valori NULL (oppure '')
Insomma per una certa tabella vorrei capire quali campi non sono mai stati usati
 

giannimaione

Well-Known Member
Licensed User
Longtime User
che in OGNI record della tabella non hanno valore
Dove la colonna campo1 e campo2 in alcuni casi hanno valori NULL mentre il campo3 NO.
Vogliamo riportare il risultato su una singola riga di quali colonne hanno eventuali valori NULL
credo che il risultato/soluzione di @MarcoRome non è quello richiesto da @amorosik
lui vuole le colonne MAI usate, quindi devono avere un valore NULL su TUTTI i records
 
Top