簡體   English   中英

根據滿足什么條件排序行?

[英]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語句:

ms-access-復雜-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)));

這樣的事情應該有效:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM