2013-03-12 13 views
7

Cercando di eseguire il debug di alcuni join che sembravano restituire prodotti cartesiani, ho inserito la condizione ON equivalente in selects.È un'espressione condizionale SQL valida o un bug MySQL (funzionalità)?

In MySQL

select * 
from table 
where columnname 

sembra comportarsi come se ho digitato where columname is not null. In join digitando on table.columnname viene accettato ma restituisce un sacco di righe. MySQL fa la cosa giusta se lo correggo a on table1.column=table2.column ma sicuramente la mia prima versione era errata e illegale.

+3

Presumibilmente getta il valore in 'columnname' in boolean e restituisce quelle righe dove viene valutato true. –

+3

@MartinSmith: MySQL non ha un tipo di dati booleano reale. Tratta semplicemente ogni numero che non è zero come vero. Perciò 'delete from foo where 42' eliminerà volentieri tutte le righe della tabella senza lamentarsi della sintassi non valida. –

+1

@a_horse_with_no_name - Che dire delle stringhe? Sono sempre trattati come 'false' tranne che per '' 1''? Sembra essere il caso di [questo SQL Fiddle] (http://sqlfiddle.com/#!2/c252c/2) –

risposta

1

La maggior parte dei linguaggi di programmazione considera tutti i valori diversi da null, 0, '', false come true. mentre (1); è un ciclo infinito indipendentemente dal fatto che tu dia 1,2, 'a', vero e così via. Direi che è un comportamento predefinito predefinito e ho usato spesso clausola where

+0

In particolare, in SQL null viene implicitamente trasmesso a false quando viene indicato come condizione. –

2

I contesti di cui si sta parlando, la clausola WHERE e la clausola ON in un join, accettano semplicemente un'espressione.

SELECT ... 
FROM table1 JOIN table2 ON <expr> 
WHERE <expr> 

espressioni possono includono operatori di confronto come = ma espressioni possono anche essere semplice come una singola colonna o un singolo valore costante.

Confrontare con un altro contesto che accetta un'espressione: la select-list.

SELECT <expr>, <expr>, <expr> 

È normale utilizzare una singola colonna come espressione in questo contesto.

Problemi correlati