2013-03-12 9 views
7

デカルトをデカルトしようとしましたが、デカルト積を返すように見えました。 MySQLのこれは有効なSQL条件式か、MySQLのバグ(機能)ですか?

select * 
from table 
where columnname 

は私がwhere columname is not nullを入力したかのように振る舞うように思われます。結合では、入力はon table.columnnameですが、行のLOTSが返されます。 on table1.column=table2.columnに修正すればMySQLは正しいことを行いますが、私の最初のバージョンは間違っていて、違法です。

+3

おそらく、 'columnname'の値をブール値にキャストし、真と評価される行を返します。 –

+3

@MartinSmith:MySQLには真のブール型のデータ型がありません。それは単にゼロでないすべての数を真として扱います。そのため、 'foo from delete 42 'は、テーブル内のすべての行を無効な構文について不満なく幸せに削除します。 –

+1

@a_horse_with_no_name - 文字列はどうですか?彼らは常に「1」を除いて「偽」として扱われますか? MySQLは数に変換しようとします::http://sqlfiddle.com/# [このSQLフィドル](http://sqlfiddle.com/#!2/c252c/2) –

答えて

1

ほとんどのプログラミング言語は、null、0、 ''、false以外のすべての値をtrueとみなします。 while(1); あなたが1,2、 'a'、trueなどを指定しているかどうかにかかわらず、無限ループです。私はそのデフォルトの予想される動作と言って、よく似たwhere節を使用しています。

+0

は具体的には、SQLのNULLに暗黙的にfalseにキャストされます。 –

2

あなたが話している文脈、WHERE節、ON節は単に式を受け入れます。

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

式は=ような比較演算子を含むことができるが、式は、単一の列または単一の一定値と同じくらい簡単であることができます。

式を受け入れる別のコンテキスト(選択リスト)と比較してください。

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

このコンテキストでは、式として1つの列を使用するのが普通です。

関連する問題