2016-02-08 96 views
2

假設table1有3個屬性:first_name,last_namecountry。例如具有下列元組:基於where條件訂購結果

John White Canada 
John Smith France 
Mary Smith Canada 
Ben Smith Canada 
Mary Black USA  

我尋找那些有名字,「約翰」,還是姓「史密斯」或國家「US」:

SELECT * 
FROM table1 
WHERE 
    first_name='John' or 
    last_name='smith' or 
    country='US' 

我想按照以下順序得到結果: 首先那些帶有名字的約翰,那些帶有姓氏史密斯的人,並且最後那些帶有國家的美國人

我知道我可以編寫以下3個不同的查詢,然後使用它們的輸出按我想要的順序:

SELECT * 
FROM table1 
WHERE first_name='John' 

SELECT * 
FROM table1 
WHERE last_name='smith' 

SELECT * 
FROM table1 
WHERE country='US' 

我在尋找更好的方法。

問題1:如果我使用提到的3個查詢並找到他們的聯合,順序會改變,對嗎?如果是,我該如何追加結果?

問題2:有沒有更好的方法?

回答

5

你的ORDER BY應該是這樣的

ORDER BY CASE 
      WHEN FIRST_NAME = 'John' THEN 1 
      WHEN LAST_NAME = 'smith' THEN 2 
      ELSE 3 
     END 
1

您可以在ORDER BY子句中使用一個CASE聲明,就像這樣:

SELECT -- We NEVER use SELECT * 
    first_name, 
    last_name, 
    country 
FROM 
    Table1 
WHERE 
    first_name = 'John' OR 
    last_name = 'Smith' OR 
    country = 'US' 
ORDER BY 
    CASE WHEN first_name = 'John' THEN 0 ELSE 1 END, 
    CASE WHEN last_name = 'Smith' THEN 0 ELSE 1 END, 
    CASE WHEN country = 'US' THEN 0 ELSE 1 END