SQLite - получить эквивалентный номер строки и результат окна в SQLite до 3.25.0 - PullRequest
0 голосов
/ 03 апреля 2020

Версия SQLite поставляется с Android, максимум 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?

1 Ответ

1 голос
/ 03 апреля 2020

Это не элегантно, но работает:

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 
  )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...