[英]Order rows according to which condition is met?
我有一個非常簡單的問題:是否可以根據滿足的條件對檢索到的行進行排序? 例如,我有一個人表,我想檢索所有名字以“I”開頭,或以“ster”結尾,或包含“lo”的人,並根據滿足這些條件的順序進行排序。 首先是匹配第一個條件的行,然后是匹配第二個條件的行,依此類推。 (沒有重復:如果一行滿足第一個條件,則不應再次顯示第二個條件)
編輯:我使用 Visual C#,並使用 MS Access 管理數據庫。 (文件格式是.mdb,如果重要的話)
謝謝 =)
一般來說,你可以在你的order by
中加上一個案例陳述。
這適用於 SQL 服務器,例如:
order by (case when myCol like 'I%' then 1 when myCol like '%ster' then 2 when myCol like '%lo%' then 3 end)
您使用哪個數據庫管理系統?
更新
對於 MS-ACCESS,您可以使用此答案中所示的IIF
語句:
基於此,您可能需要以下內容:
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)));
這樣的事情應該有效:
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;
在 Access 中,您可能不得不求助於嵌套的IIF()
:
ORDER BY
IIF( name LIKE "I%", 0,
IIF( name LIKE "%ster%", 1,
IIF( name LIKE "%lo%", 2,
3
) ) ) ASC
我用 Postgres 試了一下,但我假設您可以對其他數據庫使用類似的技術。 我會為每個條件創建一個列,返回一個 Boolean 表達式是否滿足條件。 然后,按該列排序:
select
substr(Name, 1, 1) = 'I' as StartsWithI,
Name like '%ster' as EndsWithSter
from MyTable
order by StartsWithI desc, EndsWithSter desc
更新:
ms-access
標簽是在我發布此答案后添加的,但我會保留它以防它對任何人有幫助。
Switch
function 比一堆嵌套的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)
通過傳遞conditional : result參數對來使用Switch
。 評估參數 1,如果 function 為真,則返回參數 2。如果參數 1 為假,則評估參數 3,依此類推。
請注意使用True
作為倒數第二個參數,其作用類似於CASE ELSE
。
請注意,根據上下文,您可能需要將*
轉換為%
。 請參閱為什么 LIKE 在從 VB6 應用程序調用時表現不同? 獲取更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.