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
警告
如果数据库默认排序不一致,查询结果可能出现不一致的情况。建议查询语句中添加 ORDER BY 子句,以保证转换后查询结果的一致性。
当前只支持一个查询语句中只能出现一次rownum表达式,出现多次会抛转换异常。
rownum表达式只支持rownum=1或rownum<n或rownum<=n的形式(n为整数)。
rownum出现在查询列表中不支持,目前是提示转换错误,如:SELECT rownum FROM table_name。
rownum出现在函数列表中不支持,目前是透传。
不支持集合操作符(INTERSECT、MINUS)中使用rownum表达式,如: SELECT * FROM t1 WHERE rownum <= 4 INTERSECT SELECT * FROM t1 WHERE rownum <= 4
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