2012-04-10 53 views
2

我有一個非常簡單的問題:是否可以根據滿足哪個條件來檢索行? 例如,我有一張人的桌子,我想檢索名稱以「I」開頭,或以「ster」結尾或包含「lo」的所有人,根據這些人的條件。首先匹配第一個條件的行,然後匹配第二個條件的行,依此類推。 (不重複:如果行符合第一個條件,它不應再爲第二個條件顯示)根據符合哪種條件來排序?

編輯: 我用Visual C#工作,我管理與MS訪問數據庫。 (文件格式的.mdb,如果該事項)

謝謝=)

+0

不可能通過標準的sql。你可以通過編程來完成,但是如果你將結果集檢索到Java,C#等等 – ControlAltDel 2012-04-10 17:53:22

+4

不,這在標準SQL中是完全可能的。這只是一點點參與取決於一些細節。 – RBarryYoung 2012-04-10 17:57:47

+0

真正的問題是,Access支持標準SQL的一個較小的子集,而不是比較大的DBMS(比如SQL Server,Oracle,DB2等),因此可能不支持所有不同的方法。 – RBarryYoung 2012-04-10 18:01:15

回答

3

Somet興這樣應該工作:

SELECT * FROM people 
ORDER BY 
    CASE WHEN name LIKE "I%" THEN 0 
    WHEN name LIKE "%ster" THEN 1 
    WHEN name LIKE "%lo%" THEN 2 
    ELSE 3 
  END ASC; 

在訪問你可能不得不求助於嵌套IIF()小號雖然:

ORDER BY 
    IIF(name LIKE "I%",  0, 
    IIF(name LIKE "%ster%", 1, 
    IIF(name LIKE "%lo%", 2, 
    3 
))) ASC 
+0

+1 ...正確順序爲Access – 2012-04-10 18:36:16

+0

作品,謝謝:) – 2012-04-10 18:36:38

6

一般來說,你可以把一個case語句在order by

這將在SQL Server中工作,例如:

order by (case when myCol like 'I%' then 1 when myCol like '%ster' then 2 when myCol like '%lo%' then 3 end) 

是否使用的是DBMS?

UPDATE

對於MS-Access,您可以使用IIF語句如圖這樣的回答:

ms-access-complicated-order-by

基於這一點,你可能想沿着東西線:

SELECT * 
FROM people 
WHERE [name] Like "I*" Or [name] Like "*ster" Or [name] Like "*lo*" 
ORDER BY IIf([name] Like "I*", 1, IIf([name] Like "*ster", 2, IIf([name] Like "*lo*", 3, 4))); 
+0

我編輯了原文,讓所有人都可以看到。 – 2012-04-10 17:57:41

+0

@Itamar Marom,請讓我知道這是否有效,如果語法稍微偏離(不幸的是我現在無法檢查),請在此處編輯最終的Access查詢。 – 2012-04-10 18:23:50

+0

當我嘗試運行時,它要求'sortCol'好像它是一個參數... – 2012-04-10 18:31:23

1

我給了這是一個用Postgres的射門,但我會假設你可以使用與其他數據庫類似的技術。我會爲每個條件創建一個列,以返回條件是否滿足的布爾表達式。然後,命令由該列:

select 
    substr(Name, 1, 1) = 'I' as StartsWithI, 
    Name like '%ster' as EndsWithSter 
from MyTable 
order by StartsWithI desc, EndsWithSter desc 

UPDATE:

我張貼了這個答案後添加ms-access標籤,但如果它可以幫助任何人,我會離開它。

1

Switch的函數比一堆嵌套IIf語句更可讀:

SELECT * FROM [People] 
WHERE [Name] Like "I*" 
    OR [Name] Like "*ster" 
    OR [Name] Like "*lo*" 
ORDER BY Switch([Name] Like "I*", 1, 
       [Name] Like "*ster", 2, 
       True, 3) 

Switch用於通過傳遞條件參數對:結果。對參數1進行評估,如果爲true,則函數返回參數2.如果參數1爲假,則對參數3進行評估等。

請注意使用True作爲倒數第二個參數,它的作用類似於CASE ELSE

請注意,根據具體情況,您可能需要將*轉換爲%。有關更多信息,請參見Why does LIKE behave differently when being called from VB6 app?