Skip to content

Forum

Please or Register to create posts and topics.

Somma dei valori di due colonne

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

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

 

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

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

 

sabrina_c has reacted to this post.
sabrina_c