【问题标题】:How to get row number in SQLite?如何在 SQLite 中获取行号?
【发布时间】:2016-04-28 01:47:32
【问题描述】:

我已经阅读了很多关于如何在 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(我需要),那么结果就完全不同了。

【问题讨论】:

  • 如果没有 rownum 部分,您的查询会是什么样子?
  • 这取决于您想要什么样的行号:如果您想要一个唯一标识基础表中的行的数字,请使用 ROWID。如果要对查询结果的行进行编号:某些数据库提供 ROWNUM 伪字段,但 sqlite 不提供 AFAIK。已经提出了使用子查询的解决方案,例如here

标签: sqlite row-number


【解决方案1】:

您的查询包含错误:未定义别名“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;

【讨论】:

  • 抱歉 ja.title 是错误的,我已经更正了。您的查询确实有效(与我的相同),但问题是当我编辑查询“...ORDER BY t.title COLLATE NOCASE;”时。我必须使用 COLLATE NOCASE 创建表吗?
  • 不,您不必这样做。但是,您必须确保在子查询中始终使用 COLLATE NOCASE。我也将其添加到解决方案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
相关资源
最近更新 更多