2013-01-23 57 views
1

我有如下數據:(列名稱1和名稱2)作爲另一個查詢的結果。Oracle SQL:按字母順序查找唯一組合和順序

名1名2

AB

BA

然而,任何這樣的配對實際上應該被視爲只有一個,而只應報告爲AB(A來B之前,按字母順序排序)

如何在Oracle/PlSQL中執行此操作?

+0

什麼樣的「數據」?這兩行各有兩列嗎?或者兩個結果集分別具有兩列一列? – Thilo

+0

@Thilo編輯了這個問題。 2行,每行2列。 – Achow

回答

2

你可以做這樣的事情:

SELECT DISTINCT Name1, Name2 
FROM (
     SELECT Name1, Name2 FROM t WHERE Name1 <= Name2 
     UNION ALL 
     SELECT Name2, Name1 FROM t WHERE Name1 > Name2 
    ); 

這應該工作,是相當簡單,但效率不高爲:

SELECT DISTINCT 
     CASE WHEN Name1 <= Name2 THEN Name1 ELSE Name2 END AS Name1 
     ,CASE WHEN Name1 <= Name2 THEN Name2 ELSE Name1 END AS Name2 
FROM t; 

或者只是:

SELECT DISTINCT 
     LEAST(Name1, Name2) AS Name1 
     ,GREATEST(Name1, Name2) AS Name2 
FROM t; 

在這些查詢中我沒有考慮NULL。如果列可以爲空,則必須修改< =比較以考慮這些因素。

+0

完美,我知道第二個答案更有效率,但第一個答案真的是我喜歡的一個聰明的解決方案。 – Achow

+0

+1使用'<='比較字符串的好邏輯。 – TechDo

+0

增加了我最喜歡的第三個選項 - 簡單,高效。 –