powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Выборка по регулярному выражению без повторов.
7 сообщений из 7, страница 1 из 1
Выборка по регулярному выражению без повторов.
    #39067389
AnEagle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Столкнулся с такой задачкой:
Пусть есть следующая база данных:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
create table t1 (_id integer primary key autoincrement, dir text not null unique);

insert into t1 values (1, "/dir_1/subdir_1/item_1");
insert into t1 values (2, "/dir_1/subdir_1/item_2");
insert into t1 values (3, "/dir_1/subdir_2/item_1");
insert into t1 values (4, "/dir_1/item_1");
insert into t1 values (5, "/dir_2/item_1");



Необходимо сделать запрос, который бы возвращал содержимое определённой директории. Например для рута можно написать что-то типа того:
Код: plsql
1.
2.
3.
select * from t1 where dir like "/%" <magic>;
1|/dir_1/subdir_1/item_1
5|/dir_2/item_1

Для dir_1 должно получаться следующее:
Код: plsql
1.
2.
3.
select * from t1 where dir like "/dir_1/% <magic>";
1|/dir_1/subdir_1/item_1
4|/dir_1/item_1


Без <magic> в первом случае выходит вся таблица. Вопрос как раз в том, чему равен <magic>.

Заранее спасибо.
...
Рейтинг: 0 / 0
Выборка по регулярному выражению без повторов.
    #39067426
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://github.com/ralight/sqlite3-pcre
И вся мощь регулярок у тебя в руках.
...
Рейтинг: 0 / 0
Выборка по регулярному выражению без повторов.
    #39067429
AnEagle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И как бы ты регулярками отсёк 2, 3, 4?
...
Рейтинг: 0 / 0
Выборка по регулярному выражению без повторов.
    #39067434
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnEagle,

Представим, что последние 2 строки добавляются так:
Код: sql
1.
2.
insert into t1 values (5, "/dir_1/item_1");
insert into t1 values (4, "/dir_2/item_1");


То что должно выводиться для вашего "рут"? Примерно понимаю что вы хотите, но записи в таблицах не имеют порядка, и вывести первую и "последнюю" запись в папке не получится
...
Рейтинг: 0 / 0
Выборка по регулярному выражению без повторов.
    #39067454
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnEagleИ как бы ты регулярками отсёк 2, 3, 4?Ну их вообще-то отсекать и не нужно. Но список записей в корне можно будет получить через
select distinct dir regexp '^\/[^\/]+' from t1
...
Рейтинг: 0 / 0
Выборка по регулярному выражению без повторов.
    #39067472
AnEagle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLAD, порядок совершенно не важен. Важно, чтобы были выведены только /dir_1 и /dir_2.

На яве это можно было бы написать так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Pattern pattern = Pattern.compile("\\/([^\\/]+)\\/");
        String[] items = new String[] {
                "/dir_1/subdir_1/item_1",
                "/dir_1/subdir_1/item_2",
                "/dir_1/subdir_2/item_1",
                "/dir_1/item_1",
                "/dir_2/item_1"
        };

        Map<String, Integer> dirs = new HashMap<>();
        
        for (int i=0; i < items.length; i++) {
            Matcher matcher = pattern.matcher(items[i]);
            if (matcher.find()) dirs.put(matcher.group(1), i);
        }

        System.out.println("Directories: " + dirs);


Вместо i здесь можно получить из БД _ID, а потом уже получить необходимые курсоры. Но получать список элементов, а потом повторять query кажется не самым лучшим решением, особенно если БД большая.

Рассматриваю также варианты со следующей структурой данных:
create table t2 (_id integer primary key autoincrement, dir text not null, item text not null);
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table t2 (_id integer primary key autoincrement, dir text not null, item text not null);
insert into t2 values (1, "/", "dir_1");
insert into t2 values (2, "/dir_1", "subdir_1");
insert into t2 values (3, "/dir_1/subdir_1", "item_1");
insert into t2 values (4, "/dir_1", "subdir_2");
insert into t2 values (5, "/dir_1/subdir_2", "item_1");
insert into t2 values (6, "/dir_1/subdir_1", "item_2");
insert into t2 values (7, "/dir_1", "item_1");
insert into t2 values (8, "/", "dir_2");
insert into t2 values (9, "/dir_2", "item_1");


Тогда получить необходимый мне вывод можно просто по ключу DIR.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select * from t2 where dir = "/";
1|/|dir_1
8|/|dir_2
select * from t2 where dir = "/dir_1";
2|/dir_1|subdir_1
4|/dir_1|subdir_2
7|/dir_1|item_1

Но тут тоже не все, как хотелось бы. Во-первых, у нас будут создаваться "вспомогалельные" элементы, а во-вторых возрастёт количество обращений к БД, потому что нужно будет либо тупо реплейсить каждую директорию, либо проверять наличие недостающих директорий.
...
Рейтинг: 0 / 0
Выборка по регулярному выражению без повторов.
    #39067478
AnEagle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, модифицировать ДБ нельзя. Только штатные средства. Только хардкор.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Выборка по регулярному выражению без повторов.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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