2012-12-14 141 views
1

我有這樣的一個表:Mysql的選擇IN返回NULL如果ID不存在

+----+---------+---------+ 
| Id | column1 | column2 | 
+----+---------+---------+ 
| 1 | a  | b  | 
| 2 | a  | b  | 
+----+---------+---------+ 

像這樣SELECT * FROM table WHERE id IN (1,2,3)

做我需要得到這樣的結果(我需要什麼樣的查詢查詢讓空值nonexisten的id):

+----+---------+---------+ 
| Id | column1 | column2 | 
+----+---------+---------+ 
| 1 | a  | b  | 
| 2 | a  | b  | 
| 3 | null | null | 
+----+---------+---------+ 

編輯

感謝迄今爲止的迴應。

是否有更多'動態的方式來做到這一點,上面的查詢只是一個例子。 在現實中,我需要檢查1000左右的ID!

+1

爲什麼不創建一個帶有你想要的id值的臨時表,它們離開外部連接真正的表到臨時表? –

+0

@NuclearGhost:不需要創建臨時表;在查詢文本中使用內聯視圖是一種更簡單的方法。如果有很多id值,並且語句超出(或接近)SQL語句的最大長度(= max_allowed_pa​​cket_size) – spencer7593

+1

,但是您在哪裏獲得這些1000個ID,臨時表將是一個適當的解決方法?如果你從一個查詢中得到它們,你仍然可以在我的答案中使用一個LEFT JOIN來得到你想要的結果... – fthiella

回答

1

你可以使用這樣的事情:

SELECT ids.ID, your_table.column1, your_table.column2 
FROM 
    (SELECT 1 as ID 
    UNION ALL SELECT 2 
    UNION ALL SELECT 3) ids left join your_table 
    on ids.ID = your_table.ID 

第一子查詢返回每次在不同的行需要的價值。然後你可以嘗試加入每行your_table。如果使用left join,則會顯示第一個子查詢中的所有值,如果與your_table匹配,則會顯示your_table的值,否則您將得到空值。

+2

+1。 'UNION ALL'運算符代替'UNION'運算符 – spencer7593

+1

@ spencer7593 UNION刪除重複項,而UNION ALL不會...因爲我們不需要刪除重複項...所以最好使用union ALL ... 謝謝! – fthiella

0

這不是SQL不幸的工作方式。我認爲對於你的應用程序來說,確定它所要求的id和id的返回值之間的差異是非常微不足道的。

因此,而不是黑客或一些奇怪的查詢來模擬你的結果,爲什麼不讓你的應用程序處理它?

我仍然無法理解,雖然用例可能會在哪裏查詢數據庫上的行,可能存在也可能不存在。

相關問題