2013-03-12 9 views
7

Beim Debuggen einiger Joins, die kartesische Produkte zurückgaben, tippte ich die entsprechende ON-Bedingung in selects.Ist das ein gültiger bedingter SQL-Ausdruck oder ein MySQL-Bug (Feature)?

In MySQL

select * 
from table 
where columnname 

scheint zu verhalten, als ob ich where columname is not null getippt. In Joins wird die Eingabe on table.columnname akzeptiert, gibt aber viele Zeilen zurück. MySQL macht das Richtige, wenn ich es auf on table1.column=table2.column korrigiere, aber sicher war meine erste Version falsch und illegal.

+3

Vermutlich wird der Wert in 'columnname' in boolean umgewandelt und die Zeilen zurückgegeben, in denen der Wert true ist. –

+3

@MartinSmith: MySQL hat keinen echten booleschen Datentyp. Es behandelt einfach jede Zahl, die nicht Null ist, als wahr. Daher löscht 'delete from foo wo 42' alle Zeilen in Ihrer Tabelle, ohne sich über die ungültige Syntax zu beschweren. –

+1

@a_horse_with_no_name - Wie sieht es mit Strings aus? Werden sie immer als "falsch" behandelt, außer für "1"? Scheint der Fall von [dieser SQL Fiddle] zu sein (http://sqlfiddle.com/#!2/c252c/2) –

Antwort

1

Die meisten Programmiersprachen berücksichtigen alle anderen Werte als null, 0, '', false als wahr. während (1); ist eine Endlosschleife unabhängig davon, ob Sie 1,2, 'a', true und so weiter geben. Ich würde sagen, es ist ein Standard-Verhalten erwartet und ich habe oft ähnliche verwendet where-Klausel

+0

In SQL wird NULL implizit in false umgewandelt, wenn auf eine Bedingung verwiesen wird. –

2

Die Kontexte, über die Sie sprechen, die WHERE Klausel und die ON Klausel in einem Join, akzeptieren einfach einen Ausdruck.

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

Ausdrücke können Vergleichsoperatoren wie = umfassen Ausdrücke können auch so einfach wie eine einzelne Spalte oder einer einzigen konstanten Wert sein.

Vergleichen Sie mit einem anderen Kontext, der einen Ausdruck akzeptiert: die Select-Liste.

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

Es ist normal, eine einzelne Spalte als Ausdruck in diesem Kontext zu verwenden.

Verwandte Themen