在SQLite3数据库中提取第一个单词

时间:2012-02-27 20:10:50

标签: sqlite

我有一个SQLITE3数据库,其中我存储了各种列。一列(cmd)特别包含完整的命令行和相关参数。有没有办法只提取此列中的第一个单词(就在第一个空格之前)?我对查看使用的各种参数不感兴趣,但确实希望看到发出的命令。

以下是一个例子:

从log2限制3中选择cmd;

  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”字符串。 “用户信息”和“用户更改”相同。

有什么想法吗?

感谢。

5 个答案:

答案 0 :(得分:5)

我的解决方案:

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

优点:

  • 这不是一个肮脏的黑客
  • 它只使用核心功能

答案 1 :(得分:3)

由于你的第一个太空角色的位置未知,我认为SQLite中没有一个核心功能可以提供帮助。

我认为你必须创建一个http://www.sqlite.org/c3ref/create_function.html

答案 2 :(得分:2)

这是一个黑客

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' - '字符 - 我没有计算它们!),它就可以工作。如果您的命令可以包含“ - ”,则只使用命令中不允许的其他字符。

答案 3 :(得分:1)

我不相信你能在SQL内部做些什么。 SQLite对字符串处理函数的支持并不像其他RDBMS那样广泛(其中一些可以让你使用Reg Exp进行SUBSTR)。

我的建议是按照@Jon的建议编写自己的SQL函数,或者只是将其作为应用代码中的后处理步骤。

答案 4 :(得分:1)

“查找第一次出现”函数是SQLite3核心函数之一(http://www.sqlite.org/lang_corefunc.html)。

当然,使用instr(X,Y)更好。

所以你可以写:

SELECT substr(cmd,1,instr(cmd,' ')-1) FROM log2