SQLite - 在 SQLite 3.25.0 之前实现等效的 row_number 和 window 结果
SQLite - Achieve equivalent row_number and window outcome in SQLite pre 3.25.0
附带 Android 的 SQLite 版本,最多为 3.19 - https://developer.android.com/reference/android/database/sqlite/package-summary
然而,最近,我倾向于执行row_number()
和window
功能。但是,它仅在 3.25.0 之后才受支持 - https://www.sqlite.org/windowfunctions.html
我的目的是使用 row_number()
和 window
函数实现以下目标 -
with cte as (
select *, row_number() over win - 1 as rn from plain_note
window win as (order by
title desc,
case when type = 0 then body else searched_string end desc
)
)
update plain_note set "order" = (select rn from cte where "order" = plain_note."order");
但是,Android 中没有此类功能。我想知道,有没有办法在不使用 row_number
和 window
的情况下达到相同的结果?
它不优雅但很有效:
update plain_note
set "order" = (
select count(*)
from plain_note p
where p.title > plain_note.title
or (
p.title = plain_note.title
and
case when p.type = 0 then p.body else p.searched_string end >
case when plain_note.type = 0 then plain_note.body else plain_note.searched_string end
)
or (
p.title = plain_note.title
and
coalesce(case when p.type = 0 then p.body else p.searched_string end, '') =
coalesce(case when plain_note.type = 0 then plain_note.body else plain_note.searched_string end, '')
and
p.rowid < plain_note.rowid
)
);
附带 Android 的 SQLite 版本,最多为 3.19 - https://developer.android.com/reference/android/database/sqlite/package-summary
然而,最近,我倾向于执行row_number()
和window
功能。但是,它仅在 3.25.0 之后才受支持 - https://www.sqlite.org/windowfunctions.html
我的目的是使用 row_number()
和 window
函数实现以下目标 -
with cte as (
select *, row_number() over win - 1 as rn from plain_note
window win as (order by
title desc,
case when type = 0 then body else searched_string end desc
)
)
update plain_note set "order" = (select rn from cte where "order" = plain_note."order");
但是,Android 中没有此类功能。我想知道,有没有办法在不使用 row_number
和 window
的情况下达到相同的结果?
它不优雅但很有效:
update plain_note
set "order" = (
select count(*)
from plain_note p
where p.title > plain_note.title
or (
p.title = plain_note.title
and
case when p.type = 0 then p.body else p.searched_string end >
case when plain_note.type = 0 then plain_note.body else plain_note.searched_string end
)
or (
p.title = plain_note.title
and
coalesce(case when p.type = 0 then p.body else p.searched_string end, '') =
coalesce(case when plain_note.type = 0 then plain_note.body else plain_note.searched_string end, '')
and
p.rowid < plain_note.rowid
)
);