1. 程式人生 > >sqlite 取得結果集行號的方法

sqlite 取得結果集行號的方法

這幾天遇到了一個問題,使用sqlite怎樣取得結果集的行號?

sqlite中無法使用ROWNUM(),有的網友建議使用rowid。但rowid記錄的是原表中的行號,並不是查詢結果集的行號。

在網上查了好久也沒有找到合適的解決問題方法。

後來終於在一個英文網站上找到了完美解決問題方法,分享出來,希望廣大中國網友通過中文也能檢索到這個方法。

【問題描述】
有這樣一個sqlite database table
rowid | name
-------------
1     | John Doe
2     | Jane Smith
3     | Aaa
4     | Baaaaa
5     | Caa
6     | Dddd
7     | Eeeee
8     | Ffff
9     | Ggggg
10   | Hhhh
11   | Iiiii
12   | Jjj
13   | Kkkk

對該表按照name進行排序,rowid記錄的是原表中的實際行號
rowid | name
-------------
3     | Aaa
4     | Baaaaa
5     | Caa
6     | Dddd
7     | Eeeee
8     | Ffff
9     | Ggggg
10   | Hhhh
11   | Iiiii
2     | Jane Smith
12   | Jjj
1     | John Doe
13   | Kkkk

【期望結果】
期望得到查詢結果集的邏輯行號,如下面的rowNum
rowid | name         | rowNum
---------------------------
3     | Aaa              | 1
4     | Baaaaa        | 2
5     | Caa              | 3
6     | Dddd            | 4
7     | Eeeee          | 5
8     | Ffff               | 6
9     | Ggggg         | 7
10   | Hhhh            | 8
11   | Iiiii                | 9
2     | Jane Smith  | 10
12   | Jjj                 | 11
1     | John Doe     | 12
13   | Kkkk            | 13

【解決辦法】
SELECT
   (SELECT COUNT(*)
    FROM Names AS t2
    WHERE t2.name < t1.name
   ) + (
      SELECT COUNT(*)
      FROM Names AS t3
      WHERE t3.name = t1.name AND t3.id < t1.id
   ) + 1 AS rowNum,
   id,
   name
FROM Names t1
ORDER BY t1.name ASC