sqlite - 如何在 SQLite 中获取行号?

标签 sqlite row-number

我已经阅读了很多关于如何在 SQLite 中使用行号的文章,但没有一篇文章给了我需要的答案。我知道如何使用此查询选择行号:

SELECT (SELECT COUNT() FROM table WHERE title < t.title OR (title = t.title AND id<t.id)) as rowIndex, t.title FROM table AS t ORDER BY t.title;

但如果我添加 COLLATE NOCASE (我需要)在查询结束时结果完全不同。

最佳答案

您的查询包含错误:未定义别名“ja”。

像这样尝试:

SELECT 
  ( SELECT COUNT(*) + 1 
    FROM "table" 
    WHERE title < t.title OR (title = t.title AND id<t.id)
  ) as rowIndex, 
  t.title 
FROM "table" t 
ORDER BY t.title;

但是,请注意,此子查询构造不能很好地扩展。对于大型数据集,您可能希望创建一个临时表并使用 ROWID(如所讨论的,例如, here )。

编辑:
使用 COLLATE NOCASE 进行测试:
CREATE TABLE "table" (id INTEGER, title TEXT COLLATE NOCASE);

INSERT INTO "table" VALUES 
(1, "Book A"), 
(2, "Book b"), 
(3, "Book C"), 
(4, "Book B"), 
(5, "Book a"); 

查询产生:
1|Book A
2|Book a
3|Book b
4|Book B
5|Book C

编辑:

如果不想声明 COLLATE NOCASE 列,则必须确保在 ORDER BY 部分以及子查询中使用 COLLATE:
SELECT 
  ( SELECT COUNT(*) + 1 
    FROM "table" 
    WHERE title < t.title COLLATE NOCASE OR (title = t.title COLLATE NOCASE  AND id<t.id)
  ) as rowIndex, 
  t.title 
FROM "table" t 
ORDER BY t.title COLLATE NOCASE;

关于sqlite - 如何在 SQLite 中获取行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19479253/

相关文章:

ms-access - Access 生成结果的查询,如 T-SQL 中的 ROW_NUMBER()

reporting-services - 表中的 SSRS 行号,不包括隐藏行

sql - SQL Select:厕所在50KM内的某个位置?

.net - SQLite:BLOB用于存储大文件吗?

ios - 没有 WAL 文件的 Core Data .sqlite 备份可以恢复为在 WAL 模式下运行吗?

sqlite - 如何解锁 SQLite 数据库?

sql-server - 根据 row_number() 更新列

mysql - 左外连接?行编号问题

MySql Select with auto incrementing column not existing in table

android - 通过 C++ 创建 SQLite 数据库。通过Java SDK访问吗?