powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / псевдо-колонка ROWNUM
23 сообщений из 23, страница 1 из 1
псевдо-колонка ROWNUM
    #36619012
Tolka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, если в sqlite аналог Оракловой ROWNUM ?

Хочу, чтобы возвращало следующее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select rownum, name
  from users
  limit  5 ;

 1   Петя
 2   Вася
 3   Коля
 4   Марина
 5   Сергей
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36619014
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
В SQLite есть несколько псевдонимов для внутреннего счетчика, например, ROWID
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36619015
Tolka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он совпадает с primary key и не обязательно будет с шагом 1.

также я могу добавить сортировку, к примеру, по дате. А на выходе всё равно нужно получить равномерный список

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select rownum, name
  from users
  order by dt_system limit  5 ;

 1   Петя
 2   Вася
 3   Коля
 4   Марина
 5   Сергей

...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36619151
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Так бы и сказали, что счетчик нужен:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
sqlite> create table test(name);
sqlite> insert into test values ('a');
sqlite> insert into test values ('b');
sqlite> insert into test values ('c');
sqlite> insert into test values ('d');
sqlite> select counter( 0 ),* from test;
 0 |a
 1 |b
 2 |c
 3 |d
sqlite> select counter( 1 ),* from test;
 1 |a
 2 |b
 3 |c
 4 |d

Правда, в дефолтовой сборке этой функции, насколько я помню, нет. Нужно в исходниках ее раскомментировать и перекомпилировать или загрузить расширением. Или просто application defined функцию подключить.
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36624619
Tolka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я на фришном хостинге с sqlite2

что-либо перекомпилировать или подгружать не могу.

если application defined функция имелась ввиду такая, которая создаётся с помощью sqlite3_create_function, то опять не смогу по той же причине. К тому же с С не знаком :)


за ответ спасибо. по крайней мере стало ясно, что такая функция существует в природе
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36625363
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Tolka
если application defined функция имелась ввиду такая, которая создаётся с помощью sqlite3_create_function, то опять не смогу по той же причине. К тому же с С не знаком :)

application defined функции можно создавать на любом языке, в этом вся их прелесть.
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36626307
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и без них, на простом SQL-92
Если можно однозначно отсортировать строки, то их можно и пронумеровать.
Но по хорошему, нумерацию строк надо делать на клиенте а не на сервере.
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36626411
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlна клиенте а не на сервере.
И кто тут сервер ? :)
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36626543
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievWhite Owlна клиенте а не на сервере.
И кто тут сервер ? :)Тот кто выполняет sql команды.
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36626869
Tolka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНо по хорошему, нумерацию строк надо делать на клиенте а не на сервере.

Если нумерация нужна только для отображения, то да. Можно и на клиенте. Хотя опять таки спорный вопрос. В случае с Ораклом, все стараются делать в базе, благо возможности есть. Клиент только отображает.

В моём случае, присвоенный номер элементу списка, предварительно отсортированного в определённом порядке, является значением бизнес-логики. И оно должно сохранятся в базе.


2 MBG,

я могу представить, что я пишу функцию, которая принимает на вход значение (это будет значение колонки, или любое выражение), делает вычисления и возвращает результат

Код: plaintext
1.
2.
select name, my_func_to_upper(surname)
  from t

а мне нужен счётчик... как я определю внутри функции, для какой по счёту строки она вызывается?
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36626942
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlТот кто выполняет sql команды.
И в случае статически прилинкованного sqlite, кто тут сервер ? :)
Да в общем все зависит от определений и точки зрения на вещи ...
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36627017
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievWhite OwlТот кто выполняет sql команды.
И в случае статически прилинкованного sqlite, кто тут сервер ? :)
Да в общем все зависит от определений и точки зрения на вещи ...Хорошо.
SQL это информационный язык. Нумерация строк это последовательный проход по множеству. Последовательный проход намного проще сделать в процедурном языке чем в информационном.
Так устроит? :)
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36627565
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Dmitry ArefievWhite OwlТот кто выполняет sql команды.
И в случае статически прилинкованного sqlite, кто тут сервер ? :)
Да в общем все зависит от определений и точки зрения на вещи ...

http://ru.wikipedia.org/wiki/СерверСервер (от англ. server, обслуживающий):

Сервер (программное обеспечение) — программное обеспечение, принимающее запросы от клиентов.

Может и отдельная функция в приложении сервером называться, с точки зрения английского языка это вполне естественно.
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36627590
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Tolka
а мне нужен счётчик... как я определю внутри функции, для какой по счёту строки она вызывается?

Ваш язык программирования не содержит функции инкремента? :-) Если содержит, то заводите глобальную переменную и увеличиваете ее значение на 1 при каждом вызове функции (функция возвращает текущее значение этой переменной).
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36629095
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBGМожет и отдельная функция в приложении сервером называться, с точки зрения английского языка это вполне естественно.
Ну эдак можно дойти до того, что локальная переменная - сервер.
Принимает запросы на инкремент и выполняет их :) В мире СУБД под
сервером подразумевается чаще всего несколько иное ... Так что
это больше про термины.

А вообще - СУБД подготавливает набор записей, который по определению
порядка не имеет, так как есть множество. СУБД создает и возвращает
курсор, который есть итератор над этим множеством. И к итератору
уже применимо - номер элемента. Обычно API СУБД не предоставляет
явное API для получения номера записи в курсоре. Неявно - очень
часто. Тот же PGSQL - по номеру записи возвращает данные. Про SQLite -
его (ее ?) API не предоставляет такой информации.

Т.е. по большому делу это дело пользователя курсора - нумеровать
элементы получаемые из итератора. Примерно так ...
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36629341
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
6119Dmitry Arefiev
Т.е. по большому делу это дело пользователя курсора - нумеровать
элементы получаемые из итератора. Примерно так ...

Учитывая, что эскулайт работает в адресном пространстве пользователя, такое разделение не имеет смысла :-) В противном случае извольте называть эскулайт сервером ;-)
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36629700
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клиент/сервер или встроенная СУБД - это на тему архитектуры, вопроса
обслуживания. А курсор - это на тему API доступа к резалтсетам. Курсоры
могут использоваться, а могут и нет, независимо от используемой архитектуры.
Примеров полно ...

PS: Эко на офтопили :)
PS2: А что такое 6119 ?
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36629904
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Когда писал предыдущее сообщение, думал о том, что в случае веб-приложения клиент видит веб-сервис, одним из компонентов которого является эскулайт; фактически, в этом случае эскулайт - сервер. А пронумеровать записи можно даже яваскриптом в браузере - притом понятия курсора здесь вовсе нет, снова оперируем с множеством. Так что отсутствие номера записи в курсоре эскулайт вполне логично - в общем случае не нужен он там. Впрочем, это и в самом деле оффтопик, хотя нюанс интересный.

Dmitry ArefievPS2: А что такое 6119 ?

Капчу не туда вбил :-)
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36645399
Tolka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал функцию, но при использовании оказалось, что она не является аналогом оракловой ROWNUM. Также обнаружился один новый, для меня, момент с LIMIT

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
      $idx = C_ONE;

      function inc() {
         global $idx;
         return $idx++;
      }

      sqlite_create_function($conn->id, 'inc', 'inc', C_ZERO);

sqlite> select * from dept order by name;

id|name

 23 |Account
 44 |Domestic
 65 |Entertainment
 12 |Finance
 54 |Management
 76 |PR

1) сортировка результирующего набора выполняется ПОСЛЕ вычисления функции. В Oracle наоборот. И это, по-моему, логично. Я хочу пронумеровать то, что я получил в итоге, после проведения всех операций над множеством.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
      $query = 'SELECT inc()  AS row_num'.
               '      ,id     AS id'.
               '      ,name   AS name'.
               '  FROM dept'.
               ' ORDER BY name';

row_num	  id  	name
 2  	 23  	Account
 3  	 44  	Domestic
 5  	 65  	Entertainment
 1  	 12  	Finance
 4  	 54  	Management
 6  	 76  	PR

обратите внимание на значения row_num


2) при добавлении LIMIT отсечение происходит ПОСЛЕ сортировки. Т.е. он вытаскивает ВСЕ строки из таблицы. Делает их сортировку и потом возвращает указаное в LIMIT значение. Я думал, что он выберет первые N строк и только потом их отсортирует. Опять таки, так сделано в Oracle и так, по-моему, логичней.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      $query = 'SELECT inc()  AS row_num'.
               '      ,id     AS id'.
               '      ,name   AS name'.
               '  FROM dept'.
               ' ORDER BY name'.
               ' LIMIT 3';

row_num	  id  	name
 2  	 23  	Account
 3  	 44  	Domestic
 5  	 65  	Entertainment

3) при попытке переписать запросы в виде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
      $query = 'SELECT inc()  AS row_num'.
               '      ,id     AS id'.
               '      ,name   AS name'.
               '  FROM (SELECT id      AS id'.
               '              ,name    AS name'.
               '          FROM dept'.
               '         ORDER BY name)';

и

      $query = 'SELECT inc()  AS row_num'.
               '      ,id     AS id'.
               '      ,name   AS name'.
               '  FROM (SELECT id      AS id'.
               '              ,name    AS name'.
               '          FROM dept'.
               '         ORDER BY name)'.
               ' LIMIT 3';


с целью получить значения row_num начинающиеся с 1, результаты получались идентичными первым двум случаям
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36648377
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Нужно делать сортированный подзапрос, я когда-то этот вопрос подробно описывал:
http://sqlite.mobigroup.ru/src/wiki?name=ext_auxfunc
См. описание для функции distincton
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36674004
Tolka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBG,

Почитал про distincton.

Так я же тоже делал сортированный подзапрос. См. п. 3 моего предыдущего поста. Не помогло.

Он высчитал мою функцию ДО операции сортировки
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36674457
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
TolkaMBG,

Почитал про distincton.

Так я же тоже делал сортированный подзапрос. См. п. 3 моего предыдущего поста. Не помогло.

Он высчитал мою функцию ДО операции сортировки

Хм, я же вроде ясно описал ситуацию - нужно _две_ совпадающие сортировки, в основном запросе и в подзапросе, т.е. ваш запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
      $query = 'SELECT inc()  AS row_num'.
               '      ,id     AS id'.
               '      ,name   AS name'.
               '  FROM (SELECT id      AS id'.
               '              ,name    AS name'.
               '          FROM dept'.
               '         ORDER BY name)';
нужно дополнить еще одной сортировкой "ORDER BY name".
...
Рейтинг: 0 / 0
псевдо-колонка ROWNUM
    #36916611
Tolka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри за некропост

таки да. дополнительная сортировка решила проблему

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
      $query = 'SELECT inc()  AS row_num'.
               '      ,id     AS id'.
               '      ,name   AS name'.
               '  FROM (SELECT id      AS id'.
               '              ,name    AS name'.
               '          FROM dept'.
               '         ORDER BY name)'.
               ' ORDER BY name';

row_num	  id  	name
 1  	 23  	Account
 2  	 44  	Domestic
 3  	 65  	Entertainment
 4  	 12  	Finance
 5  	 54  	Management
 6  	 76  	PR
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / псевдо-колонка ROWNUM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]