Извлечь первое слово в базе данных SQLite3 - PullRequest
5 голосов
/ 28 февраля 2012

У меня есть база данных SQLITE3, в которой хранятся различные столбцы.В частности, один столбец (cmd) содержит полную командную строку и соответствующие параметры.Есть ли способ извлечь только первое слово в этом столбце (непосредственно перед первым пробелом)?Я не заинтересован в том, чтобы увидеть различные используемые параметры, но хочу увидеть выполненную команду.

Вот пример:

выберите cmd из log2 limit 3;

  user-sync //depot/PATH/interface.h
  user-info
  user-changes -s submitted //depot/PATH/build/...@2011/12/06:18:31:10,@2012/01/18:00:05:55

Из приведенного выше результата я хотел бы использовать встроенную функцию SQL (если она доступна в SQLITE3) для анализа первого пробела и, возможно, использовать левый вызов функции (я знаю, что она недоступна в SQLITE3) длявернуть только строку user-sync.То же самое для "user-info" и "user-changes".

Есть идеи?

Спасибо.

Ответы [ 5 ]

5 голосов
/ 09 июня 2015

Мое решение:

sqlite> CREATE TABLE command (cmd TEXT);
sqlite> INSERT INTO command (cmd) VALUES ('ls'),('cd ~'),('  mpv movie.mkv  ');
sqlite> SELECT substr(trim(cmd),1,instr(trim(cmd)||' ',' ')-1) FROM command;
ls
cd
mpv

Плюсы:

  • дело не в том, что грязный хак
  • он использует только основные функции
3 голосов
/ 28 февраля 2012

Поскольку позиция вашего первого пробела неизвестна, я не думаю, что в SQLite есть функция ядра, которая поможет.

Я думаю, вам придется создать один http://www.sqlite.org/c3ref/create_function.html

2 голосов
/ 28 февраля 2012

Вот хак

sqlite> create table test (a);
sqlite> insert into test values ("This is a test.");
sqlite> select * from test;
This is a test.
sqlite> select rtrim(substr(replace(a,' ','----------------------------------------------------------------------------------------'),1,80),'-') from test;
This

Это работает до тех пор, пока ваша самая длинная команда меньше 80 символов (и вы включаете 80 '-' символов в строку подстановки - я их не считал!).Если ваши команды могут содержать «-», просто используйте другой символ, который не разрешен в командах.

1 голос
/ 21 апреля 2015

Функция «Находит первое вхождение» является одной из основных функций SQLite3 (http://www.sqlite.org/lang_corefunc.html).

Конечно, гораздо лучше использовать instr(X,Y).

Итак, вы можете написать:

SELECT substr(cmd,1,instr(cmd,' ')-1) FROM log2
1 голос
/ 28 февраля 2012

Я не верю, что это то, что вы сможете сделать в самом SQL. Поддержка SQLite для функций обработки строк не так обширна, как в других СУБД (некоторые из которых позволили бы вам сделать SUBSTR с Reg Exp).

Мое предложение - написать собственную функцию SQL в соответствии с предложением @Jon или просто сделать это как этап постобработки в коде приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...