2011-05-08 41 views
5

說我有如下表:SQL:如何返回一個不存在的行?

================================================= 
| color_id | parent_id | language_id | name  | 
================================================= 
| 1  | 50  | 1   | Black | 
------------------------------------------------- 

然後說我需要的行WHERE parent_id = 50 AND language_id = 2。顯然,根據我的示例表,我什麼也得不到。然而,我仍然需要一個結果 - 可能是這樣的:

================================================= 
| color_id | parent_id | language_id | name  | 
================================================= 
| NULL  | 50  | 2   | NULL  | 
------------------------------------------------- 

有沒有辦法在SQL中做到這一點?

+0

出於好奇,爲什麼這樣做?這是一個有趣的問題,但我很難想出它的一個原因。 – David 2011-05-08 03:15:47

+1

@David:處理默認值... – 2011-05-08 03:27:04

+1

@David:OMG Ponies是對的。我正在嘗試使用COALESCE來進行語言翻譯(比如,如果某個特定語言的'name'存在,則使用它;否則使用存在的第一個非NULL'name')。問題在於特定語言的行不存在時,我似乎無法使用COALESCE。如果我得到一個NULL值的行,那麼我可以使用我的COALESCE解決方案。 – StackOverflowNewbie 2011-05-08 03:56:17

回答

7

你可以做兩種可能有效的記錄和默認的聯合查詢,然後選擇第一個:

SELECT * FROM 
(SELECT color_id, parent_id, language_id, name, 1 as order_rank 
FROM some_table 
WHERE parent_id = %parent_id% AND language_id = %language_id% 
UNION 
SELECT NULL, %parent_id%, %language_id%, NULL, 2 as order_rank 
) 
ORDER BY order_rank 
LIMIT 1 

(編輯靜態值排序由OMG小馬建議)

+0

+1非常好的解決方案 – Johan 2011-05-08 03:14:59

+0

我確定有IF或CASE的東西,但MySQL語法不是我通常習慣的味道。 – MPelletier 2011-05-08 03:16:53

+0

+1:我只會添加一個靜態定義的值來排序,以確保當搜索到的值存在時返回正確的行。 – 2011-05-08 03:19:17

0

嘗試使用LEFT JOIN的工作陳述。我可能沒有這樣做100%,但你的一部分的試驗和錯誤應該使這項工作。

SELECT table1.field1, table1.field2, table2.field3, table2.field4 
FROM my_table table1 
LEFT JOIN my_table table2 ON table1.field1=table2.field1 OR table1.field2=table2.field2 
0

左強制固定值第一個表應該加入工作。

select 
     YourTable.color_id, 
     ForcedSQL1Record.parent_id, 
     ForcedSQL1Record.language_id, 
     YourTable.name 
    from 
     (select 50 as Parent_ID, 
       2 as Language_ID 
      from YourTable 
      limit 1) ForcedSQL1Record 
     left join 
     YourTable 
      on ForcedSQL1Record.Parent_ID = YourTable.Parent_ID 
      AND ForcedSQL1Record Language_ID = YourTable.Language_ID 
相關問題