2013-03-12 30 views
7

試圖調試一些似乎返回笛卡爾積的連接,我將等價的ON條件輸入到選擇中。這是一個有效的SQL條件表達式或MySQL錯誤(功能)?

在MySQL

select * 
from table 
where columnname 

似乎表現得好像我打字where columname is not null。在連接輸入on table.columnname被接受,但返回LOTS的行。如果我將它更正爲on table1.column=table2.column,MySQL會做正確的事情,但我的第一個版本肯定是不正確和非法的。 「

+3

推測它會將'columnname'中的值轉換爲布爾值,並返回其計算結果爲true的那些行。 – 2013-03-12 14:34:56

+3

@MartinSmith:MySQL沒有真正的布爾數據類型。它只是將每個不爲零的數字視爲真。因此'從foo中刪除42''將會愉快地刪除表中的所有行而不會抱怨無效的語法。 – 2013-03-12 14:38:48

+1

@a_horse_with_no_name - 字符串怎麼樣?除了「1」以外,他們總是被視爲「假」嗎?似乎來自[這個SQL小提琴](http://sqlfiddle.com/#!2/c252c/2) – 2013-03-12 14:40:47

回答

1

大多數編程語言都認爲除null,0,'',false都爲true的所有值。 (1);無論你是否給1,2,'a',真等,都是無限循環。我會說它是一個默認的預期行爲,我經常使用類似的where子句。

+0

具體而言,在SQL中,當作爲條件引用時,null被隱式轉換爲false。 – 2013-03-13 16:45:20

2

您正在討論的上下文,WHERE子句和ON子句只是接受一個表達式。

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

表達式可以包括比較操作符等=但表達式也可以是單一的列或同一恆定值那樣簡單。

與接受表達式的另一個上下文進行比較:選擇列表。

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

在此上下文中使用單列作爲表達式是正常的。

相關問題