2016-08-05 38 views
1

我有簡單的MySQL表(簡化了此問題):爲什麼mysql在WHERE條件中與任何字符串匹配NULL值?

table A - id int, name varchar(255), id_b int 
table B - id int, name varchar(255) 

我具有表A這些值:

1, 'a1', 10 
2, 'a2', 11 
3, 'a3', 12 

我在表B中這些值:

21, 'b1' 
22, 'b2' 
23, 'b3' 

我有這個查詢:

SELECT A.name, (SELECT B.name FROM B WHERE B.id = A.id_b) AS name_ext FROM A WHERE name_ext = 'something'; 

我期望得到空的結果,但是相反,我從表A中獲得了全部3行,值爲name_ext,其值爲NULL。這怎麼可能 ?我該如何獲得預期的結果?

非常感謝您的幫助。

+1

這個查詢甚至不應該編譯。我想你簡化得太多了。您不能在'where'子句中使用別名 –

+1

@juergend然後'A'必須有一個名爲'name_ext'的列。但是OP顯示了A的(簡化的)定義。因此,這個問題在轉錄中可能是一個錯誤。 –

+0

對不起,我在簡化查詢時犯了錯誤。然後我發現原始查詢中存在什麼問題,但與此問題無關,因此我將其標記爲刪除。謝謝大家的努力 – Frodik

回答

1

此查詢的行爲正確。它相當於以下內容:

SELECT A.name, B.name 
FROM A 
LEFT OUTER JOIN B ON B.id = A.id_b 
WHERE A.name_ext = 'something' 

如果沒有匹配,則外部聯接會將B. *中的所有列作爲NULL返回。但查詢的結果仍然有A.

的每一行的行同樣,在您的版本:無論

SELECT A.name, (SELECT B.name FROM B WHERE B.id = A.id_b) AS name_ext 
FROM A WHERE name_ext = 'something'; 

主要查詢返回A的每一行的行。 如果子查詢在B中找到匹配項,則返回該值。否則,如果它發現不匹配,查詢仍會返回一行,並且B中不存在匹配的情況在第二列中顯示爲NULL。

如果您想查詢返回那些在B中的匹配行,使用:

SELECT A.name, B.name 
FROM A 
INNER JOIN B ON B.id = A.id_b 
WHERE A.name_ext = 'something' 
0

你會得到一個錯誤信息與您的查詢。因爲MySQL會理解你是通過表A中的name_ext列過濾的。

無論如何,您可以使用內部連接查詢來獲得您的預期結果。

SELECT A.name as name, B.name as name_ext 
FROM A INNER JOIN B on A.id_b = B.id 
WHERE B.name = 'something'; 

希望這對您有用。

相關問題