Ho provato anch’io la famosa intelligenza artificiale Chat GPT (https://openai.com/blog/chatgpt/) per testare la sua conoscenza del linguaggio SQL, declinato in particolare nel dialetto T-SQL del database SQL Server. Il risultato non è stato sorprendete come mi aspettavo, scrivo questo articolo a fine 2022, sarà bello tornare a rileggerlo tra qualche anno!
Di quali argomenti di SQL ho parlato con ChatGPT
Ho voluto testare Chat GPT su un argomento un po’ di nicchia che richiede una conoscenza abbastanza approfondita del T-SQL: le differenze tra Coalesce e Isnull. Entrambe le espressioni permettono di gestire i NULL su SQL Server e in molti casi (ma non tutti) il loro utilizzo è intercambiabile, se non per una maggiore flessibilità del Coalesce sul numero di parametri accettati.
Tuttavia, a un’analisi più approfondita, c’è qualche differenza in più, in alcuni casi anche sostanziale. Ne ho parlato nel dettaglio in questo articolo https://www.yimp.it/sql-coalesce-isnull/ ma se volete un antipasto provate a lanciare questo codice e otterrete due risultati differenti: ‘abc’ per Coalesce e solo ‘a’ per Isnull.
DECLARE @x AS VARCHAR(1) = NULL, @y AS VARCHAR(3) = 'abc'; SELECT COALESCE(@x, @y) AS [COALESCE], ISNULL(@x, @y) AS [ISNULL];
Vi confesso che io ho stesso ho programmato per anni in SQL senza conoscere queste differenze, ma comunque si tratta di un tema abbastanza noto presente ad esempio nei libri per prepararsi alle certificazioni Microsoft. Inoltre nella documentazione ufficiale di Coalesce di SQL Server è presente un paragrafo espressamente dedicato alle differenze con Isnull (ecco il link https://learn.microsoft.com/it-it/sql/t-sql/language-elements/coalesce-transact-sql?view=sql-server-ver16). Insomma, niente di impossibile o non documentato per un’intelligenza artificiale che, a detta di qualcuno, dovrebbe presto far perdere il posto a tutti i programmatori del mondo.
Quali domande precise ho posto a ChatGPT
Sono partito con questa domanda secca:
“Qual è su SQL Server la differenza tra Isnull e Coalesce?”
Non voglio riportarvi integralmente le risposta di Chat GPT sia per non appesantire l’articolo e sia per non violare qualche possibile forma di Copyright, potete comunque provare anche voi a porgli le stesse domande.
In breve, ho ricevuto una risposta sostanzialmente concisa in cui mi veniva spiegato che entrambe le funzioni possono essere utilizzate per sostituire i NULL, ma che Coalesce è in generale più flessibile perché può avere in input più argomenti. Se proprio vogliamo essere pignoli e trovare il pelo nell’uovo, Chat GPT dice espressamente che si tratta di due funzioni di SQL Server, ma in realtà tecnicamente Coalesce è un’espressione e non una funzione.
Comunque, pignolerie a parte, direi che come risposta generica è sostanzialmente corretta. È la stessa che darei anche io a qualcuno che me lo chiedesse alla macchinetta del caffè. A questo punto ho provato a tornare sull’argomento chiedendo
“Ci sono ulteriori differenze tra le due funzioni su SQL Server?”
In questo caso la risposta non mi è proprio piaciuta. Chat GPT ribadisce la differenza sul numero di argomenti accettati ma poi inventa totalmente delle differenze che non esistono, o quantomeno non su SQL Server. Mi dice che:
- Isnull può essere utilizzato solo per sostituire i valori NULL con un valore di tipo numerico che è falso;
- Coalesce non esegue alcuna conversione implicita che in generale è falso;
- una frase non scritta benissimo in italiano per cui Isnull può essere usato solo in un’espressione (?) mentre Coalesce è più flessibile. Anche questo direi che è falso, dovunque scriva Coalesce posso scrivere anche Isnull, in caso contrario correggetemi pure.
Ho provato poi a porre una domanda più specifica:
Ci sono differenze in termini di performance tra COALESCE e ISNULL su SQL Server?
Chat GPT risponde che non ci sono significative differenze ma che Coalesce è in generale più flessibile nella scrittura del codice.
Lo incalzo allora con una domanda più diretta:
Sicuro? Quali di queste due query pensi sia più efficiente?
1) SELECT COALESCE( (SELECT COUNT(*) FROM CLIENTI), 1)
2) SELECT ISNULL((SELECT COUNT(*) FROM CLIENTI), 1)
E lui sostanzialmente ribadisce la risposta precedente, aggiungendo all’inizio della risposta la locuzione “come accennato in precedenza”, un po’ come quando sei arrabbiato e rispondi a una mail facendo notare che a quella specifica domanda avevi già risposto in una mail precedente 🙂
A questo punto sfodero la carta finale e scrivo:
E se ti dicessi che ti sbagli? La COALESCE è equivalente a una CASE WHEN, di conseguenza il numero di righe verrebbe calcolato due volte, prima per vedere se il risultato è null e poi per restituire effettivamente il risultato. Con ISNULL invece il calcolo verrebbe fatto una sola volta. Che ne pensi?
E la risposta è stata…
An error occurred. If this issue persists please contact us through our help center at help.openai.com.
A questo punto ho cliccato sul tasto retry e ho ottenuto, dopo qualche secondo, una risposta abbastanza lunga ma sostanzialmente inconcludente che ripeteva alcune delle (false) affermazioni precedenti. A un certo punto la pagina web si è bloccata mentre Chat GPT stava scrivendo e non sono riuscito a porre altre domande senza fare un refresh della pagina.
Come ho continuato la conversazione con Chat GPT
A questo punto ho ricaricato la pagina web e ho provato a porre altre domande che lo portassero a scrivere codice SQL. Qui la situazione direi che è ulteriormente peggiorata. Ho chiesto:
Mi fai un esempio su sql server dove coalesce e isnull danno un risultato diverso?
Mi ha fornito un esempio che genera un errore perché Isnull non può accettare tre parametri:
SELECT COALESCE(NULL, 1, 2) AS "COALESCE", ISNULL(NULL, 1, 2) AS "ISNULL";
Glielo faccio notare gentilmente:
Ho appena lanciato la tua istruzione e ottengo un errore: Messaggio 174, livello 15, stato 1, riga 3
La funzione isnull richiede 2 argomenti. Sei sicuro della risposta che mi hai dato?
Chat GPT si corregge! Scrive: “Ahimè, sembra che ci sia stato un errore nella mia risposta.” mi propone un’altra query e conclude con “Spero che questo chiarisca la situazione.”
Tuttavia la query scritta restituiva lo stesso risultato per Isnull e Coalesce, quindi gli scrivo
No, perché ti avevo chiesto un esempio dove i due risultati erano diversi
Al che mi fornisce un’altra query con il relativo output. Tuttavia questa volta è proprio l’output a essere sbagliato!
Infatti sostiene che questa query
SELECT COALESCE(NULL, NULL, 2) AS "COALESCE", ISNULL(NULL, 2) AS "ISNULL";
restituisca NULL | 2. Gli scrivo quindi
Ho lanciato l’istruzione che mi hai suggerito SELECT COALESCE(NULL, NULL, 2) AS “COALESCE” e ho ottenuto 2. Perché tu dici che restituisce null?
E Chat GPT mi risponde che c’è stato un malinteso facendomi un altro esempio (questa volta corretto) ma che non aveva nulla a che vedere con la domanda di partenza di trovare differenze tra Coalesce e Isnull.
Chat-GPT mi ha dato un risultato errato
A questo punto ho riportato espressamente io un esempio in cui Coalesce e Isnull danno risultati diversi e gli ho chiesto se fosse effettivamente così. Gli ho scritto
queste due istruzioni restituiscono un valore diverso su sql server?
DECLARE
@x AS VARCHAR(3) = null,
@y AS VARCHAR(10) = ‘abcdefg’;
SELECT
COALESCE(@x, @y) AS [COALESCE],
ISNULL(@x, @y) AS [ISNULL];
E purtroppo mi ha risposto che il risultato in entrambi i casi è ‘abcdefg’ il che è falso, perché l’Isnull restituisce solo ‘abc’.
Provo a fargli capire inutilmente l’errore:
E se ti dicessi che ti sbagli? Sto parlando di SQL Server, sei sicuro che isnull in questo caso restituisca abcdefg
Ma lui conferma quanto scritto in precedenza. Scrivo allora
Se io lancio esattamente il codice che mi proponi tu
@x AS VARCHAR(3) = NULL,
@y AS VARCHAR(10) = ‘abcdefg’;
SELECT
ISNULL(@x, @y) AS [ISNULL];
ottengo ‘abc’, no ‘abcdefg’ come sostieni tu. Perché?
Chat GPT conferma che per lui il risultato è dato da tutte e sei le lettere e aggiunge che potrebbe dipendere dalla versione di SQL Server. Allora mi gioco l’ultima cartuccia, magari sono io in difetto perché su qualche versione vecchissima di SQL Server l’output era diverso. Gli chiedo allora
Tu quale versione di SQL SERVER stai utilizzando per darmi la risposta?
A questo punto ottengo una risposta illuminante in cui Chat GPT mi dice di essere un modello di linguaggio naturale che non utilizza e non ha accesso a SQL Server, le sue risposte si basano sulla conoscenza generale di Coalesce e Isnull e sulla sintassi per utilizzarle. E mi consiglia infine di guardare la documentazione di SQL Server o di rivolgermi a un esperto.
Considerazioni finali personali
Da un lato sono rimasto sorpreso da come le risposte di Chat GPT siano davvero simili a quelle che darebbe un essere umano, quasi indistinguibili. D’altra parte penso che tutti dobbiamo riflettere sull’attendibilità di modelli di questo tipo. L’ultima risposta che mi ha dato dovrebbe chiarire che Chat GPT si basa sull’elaborazione dell’enorme mole di informazioni che ha ricevuto in input. Se in alcuni casi tali informazioni sono errate, anche le sue risposte saranno tali, non c’è intelligenza artificiale che tenga.
Ma siamo davvero sicuri che l’intelligenza umana sia invece tanto diversa o superiore? O siamo semplicemente anche noi il frutto di ciò che ci viene insegnato e inculcato fin da piccoli? A un certo punto della nostra vita prendiamo una consapevolezza migliore del mondo che ci circonda, ma ciò non è comunque dovuto a un’esperienza diretta e al confronto con altre persone e altri luoghi?
Lascio la risposta a persone più competenti di me in ambito antropologico. Nel mio piccolo, spero che in Chat GPT si possa essere installato il dubbio che su SQL Server Coalesce e Isnull non sono poi così tanto uguali come crede. Un po’ come il viaggiare, il confrontarsi e il dialogare con altre persone dovrebbe aiutare chiunque, tutti compresi, a mettere sempre in discussione le proprie convinzioni.