2016-02-04 98 views
1

我有一個表有copy列。 copy列有兩個值:baseoverride。我有一個簡單的問題。我想返回所有行where copy = 'override'但如果沒有,則返回所有行。SQL if或coelesce語句where條款

我的邏輯是這樣的:返回其中副本被覆蓋的所有行。如果沒有,則返回所有行,因爲剩下的行只有base行。

我很難搞清楚這一點。這可以在一個聲明中完成嗎?
謝謝。

+0

而不是coelesce您嘗試CASE語句? –

+0

請顯示您嘗試使用的SQL語句。 – BWS

回答

1

試試這個:

SELECT * FROM TABLE 
WHERE copy = 'override' 
or(select count(*) from TABLE where copy = 'override') = 0 

其未經測試,所以告訴我,如果它的工作原理。我們的想法是選擇copy = override,或者在沒有覆蓋的情況下,第一個條件總是假的,它會進入OR部分,然後理想的是我試圖在那裏實現類似1 = 1的東西,所以所有的行將被提取

+0

所以你的方法意味着OR語句顯示第一個條件的優先級? – arcee123

+0

第一個條件優先於或聲明 – sagi

1

您可以嘗試

SELECT * 
FROM `YourTable` 
WHERE `copy` = (SELECT IF(
    (
     SELECT `copy` 
     FROM `YourTable` 
     WHERE `copy` = 'override' 
     LIMIT 1) = "override", 
    'override', 
    'base' 
    ))