Somma dei valori di due colonne
Quote from Ferdinando_B on 11/12/2020, 15:11Salve,
per sbaglio sono incappato in un comportamento di sql che non conoscevo (purtroppo).
Per errore in una query è stato omesso il carattere separatore tra due colonne di tipo int...
il risultato è stato che la select non ha restituito l'errore ma ha restituito seconda colonna con la somma dei valori di entrambe
[COLONNA1] => VALORE 10
[COLONNA2] => VALORE 50
SELECT [COLONNA1][COLONNA2]...
risultato
[COLONNA2]
60
Qualcuno ha mai sperimentato questa tecnica?... fino a che punto è attendibile?
Grazie a tutti
Salve,
per sbaglio sono incappato in un comportamento di sql che non conoscevo (purtroppo).
Per errore in una query è stato omesso il carattere separatore tra due colonne di tipo int...
il risultato è stato che la select non ha restituito l'errore ma ha restituito seconda colonna con la somma dei valori di entrambe
[COLONNA1] => VALORE 10
[COLONNA2] => VALORE 50
SELECT [COLONNA1][COLONNA2]...
risultato
[COLONNA2]
60
Qualcuno ha mai sperimentato questa tecnica?... fino a che punto è attendibile?
Grazie a tutti
Quote from sabrina_c on 11/12/2020, 19:57Ho provato a replicare quanto hai detto su SqlServer 2019 e il risultato di
select id, [value1] [value2] from TbNumeri
è il seguente
id value2
1 10
2 20
3 30Quindi ho provato la seguente query
select [value1] [value2] from TbNumeri
Ed il risultato è
value2
10
20
30Mentre invece
select ID, [value1] + [value2] AS totale from TbNumeri
ID totale 1 60 2 80 3 100Mi da i valori attesi
Questa è la mia tabella
ID Value1 Value2 Dec1 Dec2 1 10 50 10.000000 50.000000 2 20 60 20.000000 60.000000 3 30 70 30.000000 70.000000Se nelle colonne numeriche puoi avere dei valori NULL, come qui sotto
ID Value1 Value2 Dec1 Dec2 1 10 50 10.000000 50.000000 2 20 60 20.000000 60.000000 3 30 70 30.000000 70.000000 4 NULL 20 NULL 10.000000 5 10 NULL 50.000000 NULLQuesta query
select ID, Value1 + Value2 as Totale from TbNumeri
Restituisce questo valore
ID Totale 1 60 2 80 3 100 4 NULL 5 NULLPer ottenere i valori anche quando le colonne fossero nulle la query diviene la seguente:
select ID, isnull(Value1,0) + isnull(Value2,0) as Totale from TbNumeri
Per ottenere
ID Totale
1 60
2 80
3 100
4 20
5 10Lo stesso funziona per le colonne di tipo Decimal.
Non so esattamente su che tipo di dati hai provato o su quale RDBMS hai provato, ma non era SQL Server.
Se mi dici qual'è il Motore database posso fare qualche test ulteriore.
Saluti
Ho provato a replicare quanto hai detto su SqlServer 2019 e il risultato di
select id, [value1] [value2] from TbNumeri
è il seguente
id value2
1 10
2 20
3 30
Quindi ho provato la seguente query
select [value1] [value2] from TbNumeri
Ed il risultato è
value2
10
20
30
Mentre invece
select ID, [value1] + [value2] AS totale from TbNumeri
ID totale 1 60 2 80 3 100
Mi da i valori attesi
Questa è la mia tabella
ID Value1 Value2 Dec1 Dec2 1 10 50 10.000000 50.000000 2 20 60 20.000000 60.000000 3 30 70 30.000000 70.000000
Se nelle colonne numeriche puoi avere dei valori NULL, come qui sotto
ID Value1 Value2 Dec1 Dec2 1 10 50 10.000000 50.000000 2 20 60 20.000000 60.000000 3 30 70 30.000000 70.000000 4 NULL 20 NULL 10.000000 5 10 NULL 50.000000 NULL
Questa query
select ID, Value1 + Value2 as Totale from TbNumeri
Restituisce questo valore
ID Totale 1 60 2 80 3 100 4 NULL 5 NULL
Per ottenere i valori anche quando le colonne fossero nulle la query diviene la seguente:
select ID, isnull(Value1,0) + isnull(Value2,0) as Totale from TbNumeri
Per ottenere
ID Totale
1 60
2 80
3 100
4 20
5 10
Lo stesso funziona per le colonne di tipo Decimal.
Non so esattamente su che tipo di dati hai provato o su quale RDBMS hai provato, ma non era SQL Server.
Se mi dici qual'è il Motore database posso fare qualche test ulteriore.
Saluti
Quote from Ferdinando_B on 13/12/2020, 11:35In effetti avevo dimenticato di indicare che la versione di sql è la 2008 R2..
viene restituita la somma delle due colonne anche omettendo l'operatore...
comportamento riscontrato sia da codice c# con sqlcommand che con il management di sql (che credo utilizzi sempre sqlcommand, quindi dovrebbe essere la stessa cosa)..
Ciò che non mi aspettavo è stata l'esecuzione della query senza l'errore.
L'omissione del separatore di colonne o di un operatore pensavo fosse un elemento formale di struttura della query rilevante..
Potete solo immaginare in un progetto complesso con decine di query per calcoli, aggiornamento tab temporanee ecc.. come mi ha fatto impazzire nel capire come mai alcuni risultati erano errati.
nella fattispecie mi sommava due colonne di riferimento ad altre tabelle restituendomi il valore dell'ultima colonna diverso rispetto a quello registrato nella tabella...
per intenderci nella colonna era memorizzato l'id cliente 25 che nella query diventava 28 e quindi tutte le query sucessive puntavano a cercare i dati del cliente 28 anzichè 25 tirando fuori un minestrone mostruoso
In effetti avevo dimenticato di indicare che la versione di sql è la 2008 R2..
viene restituita la somma delle due colonne anche omettendo l'operatore...
comportamento riscontrato sia da codice c# con sqlcommand che con il management di sql (che credo utilizzi sempre sqlcommand, quindi dovrebbe essere la stessa cosa)..
Ciò che non mi aspettavo è stata l'esecuzione della query senza l'errore.
L'omissione del separatore di colonne o di un operatore pensavo fosse un elemento formale di struttura della query rilevante..
Potete solo immaginare in un progetto complesso con decine di query per calcoli, aggiornamento tab temporanee ecc.. come mi ha fatto impazzire nel capire come mai alcuni risultati erano errati.
nella fattispecie mi sommava due colonne di riferimento ad altre tabelle restituendomi il valore dell'ultima colonna diverso rispetto a quello registrato nella tabella...
per intenderci nella colonna era memorizzato l'id cliente 25 che nella query diventava 28 e quindi tutte le query sucessive puntavano a cercare i dati del cliente 28 anzichè 25 tirando fuori un minestrone mostruoso
Quote from Ferdinando_B on 13/12/2020, 12:18Scusate ho ripetuto il test ed ho avuto riscontro anche dall'esempio postato da sabrina C.
Sono stato ingannato 2 volte e per fortuna ho finalmente capito cosa è successo...
la query
SELECT [COL1][COL2]
restituisce il valore di [COL1] con etichetta di [COL2]
l'ho provato anche in sql 2014 e si ottiene lo stesso comportamento... ma vedendo l'esempio di sabrina credo che anche l'attuale 2019 si comporti così... quindi deduco che omettendo la virgola l'istruzione percepisce la scritta tra [] come una dichiarazione implicita di as cambiando l'etichetta e quindi il nome alla colonna di origine proprietaria del valore.
Quindi ricapitolando l'istruzione
SELECT [COL1][COL2]
equivale a SELECT [COL1] as [COL2]
ho provato a cambiare l'istruzione omettendo le parentesi e si ottiene lo stesso risultato
SELECT COL1 [COL2], COL1 COL2, [COL1] COL2
per ottenere finalmente l'errore occorre inserire una terza stringa
spero che possa servire a qualcuno che come me non conosceva questo comportamento.
Saluti a tutti
Scusate ho ripetuto il test ed ho avuto riscontro anche dall'esempio postato da sabrina C.
Sono stato ingannato 2 volte e per fortuna ho finalmente capito cosa è successo...
la query
SELECT [COL1][COL2]
restituisce il valore di [COL1] con etichetta di [COL2]
l'ho provato anche in sql 2014 e si ottiene lo stesso comportamento... ma vedendo l'esempio di sabrina credo che anche l'attuale 2019 si comporti così... quindi deduco che omettendo la virgola l'istruzione percepisce la scritta tra [] come una dichiarazione implicita di as cambiando l'etichetta e quindi il nome alla colonna di origine proprietaria del valore.
Quindi ricapitolando l'istruzione
SELECT [COL1][COL2]
equivale a SELECT [COL1] as [COL2]
ho provato a cambiare l'istruzione omettendo le parentesi e si ottiene lo stesso risultato
SELECT COL1 [COL2], COL1 COL2, [COL1] COL2
per ottenere finalmente l'errore occorre inserire una terza stringa
spero che possa servire a qualcuno che come me non conosceva questo comportamento.
Saluti a tutti