3.2.9.8. SQLite

3.2.9.8.1. ROWNUM 伪列

ROWNUM 伪列会对查询结果中的每一行进行编号,其值为该行在查询结果集中的具体位置。例如,第一行返回值 1,第二行返回值 2,之后以此类推。

-- 转换前Oracle SQL:
SELECT * FROM unisql_employee WHERE rownum = 1;

-- 转换后SQLite SQL:
SELECT * FROM `unisql_employee` WHERE 1=1 LIMIT 1

-- 转换前Oracle SQL:
SELECT * FROM unisql_employee WHERE rownum < 5;

-- 转换后SQLite SQL:
SELECT * FROM `unisql_employee` WHERE 1=1 LIMIT 5-1

-- 转换前Oracle SQL:
SELECT * FROM unisql_employee WHERE rownum <= 5;

-- 转换后SQLite SQL:
SELECT * FROM `unisql_employee` WHERE 1=1 LIMIT 5

警告

  1. 如果数据库默认排序不一致,查询结果可能出现不一致的情况。建议查询语句中添加 ORDER BY 子句,以保证转换后查询结果的一致性。

  2. 当前只支持一个查询语句中只能出现一次rownum表达式,出现多次会抛转换异常。

  3. rownum表达式只支持rownum=1或rownum<n或rownum<=n的形式(n为整数)。

  4. rownum出现在查询列表中不支持,目前是提示转换错误,如:SELECT rownum FROM table_name。

  5. rownum出现在函数列表中不支持,目前是透传。

  6. 不支持集合操作符(INTERSECT、MINUS)中使用rownum表达式,如: SELECT * FROM t1 WHERE rownum <= 4 INTERSECT SELECT * FROM t1 WHERE rownum <= 4

  7. UNION, UNION ALL转SQLite也存在限制,由于SQLite不支持 select * from students where id in ((select id from students) union (select id from students_2)); 因此UNION 两侧不能是括号表达式

-- Oracle
select * from tab ;
id | name
---+------
1  | a
2  | b
3  | c

-- SQLite
select * from tab ;
id | name
---+------
3  | c
2  | b
1  | a

-- 加上rownum,却少order by 结果可能不一致
-- Oracle
select * from tab where rownum = 1;
id | name
---+------
1  | a

-- SQLite
select * from tab where 1=1 limit 1;
id | name
---+------
3  | c