【问题标题】:Extract first word in a SQLite3 database提取 SQLite3 数据库中的第一个单词
【发布时间】:2015-06-10 03:20:39
【问题描述】:

我有一个 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 中不可用)只返回“用户同步”字符串。 “用户信息”和“用户更改”相同。

有什么想法吗?

谢谢。

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    我的解决方案:

    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
    

    优点:

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

    【讨论】:

      【解决方案2】:

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

      当然,使用instr(X,Y)会好很多。

      所以你可以写:

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

      【讨论】:

        【解决方案3】:

        由于您的第一个空格字符的位置未知,我认为 SQLite 中的核心函数没有帮助。

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

        【讨论】:

        • 不,但有 3 个核心功能会有所帮助!看我的回答。
        【解决方案4】:

        这是一个技巧

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

        【讨论】:

          【解决方案5】:

          我不相信您可以在 SQL 本身中做到这一点。 SQLite 对字符串处理函数的支持不如其他 RDBMS 广泛(其中一些允许您使用 Reg Exp 执行 SUBSTR)。

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

          【讨论】:

            猜你喜欢
            • 2018-04-05
            • 2018-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-02
            • 1970-01-01
            • 2021-01-09
            • 1970-01-01
            相关资源
            最近更新 更多