Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQLite中获取子字符串?_Sqlite - Fatal编程技术网

如何在SQLite中获取子字符串?

如何在SQLite中获取子字符串?,sqlite,Sqlite,有一个专栏。 它的价值观是 “/abc/def/ghi/w1.xyz” “/jkl/mno/r.stuv” (它是路径数据,每个值中的“/”数不是固定的。) 如何获取具有如下值的子字符串列 “/abc/def/ghi/” “/jkl/mno/” (仅提取目录部分。删除文件部分。) 我读过关于substr(X,Y),substr(X,Y,Z),instr(X,Y)的书 但是应用它们并不容易,因为每个值中的“/”的数量不是固定的,instr(X,Y)似乎从左边找到第一个匹配项。如果您在Unix/

有一个专栏。 它的价值观是

“/abc/def/ghi/w1.xyz”

“/jkl/mno/r.stuv”

(它是路径数据,每个值中的“/”数不是固定的。)


如何获取具有如下值的子字符串列

“/abc/def/ghi/”

“/jkl/mno/”

(仅提取目录部分。删除文件部分。)


我读过关于substr(X,Y),substr(X,Y,Z),instr(X,Y)的书


但是应用它们并不容易,因为每个值中的“/”的数量不是固定的,instr(X,Y)似乎从左边找到第一个匹配项。

如果您在Unix/Linux环境中,您可以这样做(让我们举个例子)

假设
test.db
是您的SQLite3数据库,其表如下所示:

create table test (dataset text);
insert into test (dataset) values ('/abc/def/ghi/w1.xyz');
insert into test (dataset) values ('/jkl/mno/r.stuv');
从命令行,您可以运行:

sqlite3 test.db -batch -noheader "select dataset from test"
这将为您提供输出(我知道这不是您想要的输出,但请继续阅读):

解释

  • -batch
    -noheader
    开关抑制除SQL语句产生的数据外的所有输出
  • sqlite3 test.db-batch-noheader“sql语句”
    运行您提供的sql语句,并将输出转储到屏幕上(stdout)
解决方案 现在,我们将使用
awk
来获得您想要的:

sqlite3 test.db -batch -noheader "select dataset from test" | awk -F'/' 'BEGIN{OFS="/"} {$NF = ""; print $0}'
结果将是:

/abc/def/ghi/
/jkl/mno/
粗略解释

  • awk
    适用于sqlite3命令输出的每一行
  • 该行由
    /
    字符和
    -F'/'
    开关分割
  • 由于我们希望输出按原样包含分隔符,因此我们还使用
    OFS='/'
    将输出字段分隔符设置为
    '/'
  • 我们以忽略最后一项的方式设置字段数(NF),然后打印其余数据
  • 打印其他拆分字段时,OFS会在这些字段之间插入
    /

如果您在Unix/Linux环境中,您可以执行类似的操作(让我们举个例子)

假设
test.db
是您的SQLite3数据库,其表如下所示:

create table test (dataset text);
insert into test (dataset) values ('/abc/def/ghi/w1.xyz');
insert into test (dataset) values ('/jkl/mno/r.stuv');
从命令行,您可以运行:

sqlite3 test.db -batch -noheader "select dataset from test"
这将为您提供输出(我知道这不是您想要的输出,但请继续阅读):

解释

  • -batch
    -noheader
    开关抑制除SQL语句产生的数据外的所有输出
  • sqlite3 test.db-batch-noheader“sql语句”
    运行您提供的sql语句,并将输出转储到屏幕上(stdout)
解决方案 现在,我们将使用
awk
来获得您想要的:

sqlite3 test.db -batch -noheader "select dataset from test" | awk -F'/' 'BEGIN{OFS="/"} {$NF = ""; print $0}'
结果将是:

/abc/def/ghi/
/jkl/mno/
粗略解释

  • awk
    适用于sqlite3命令输出的每一行
  • 该行由
    /
    字符和
    -F'/'
    开关分割
  • 由于我们希望输出按原样包含分隔符,因此我们还使用
    OFS='/'
    将输出字段分隔符设置为
    '/'
  • 我们以忽略最后一项的方式设置字段数(NF),然后打印其余数据
  • 打印其他拆分字段时,OFS会在这些字段之间插入
    /
带有递归:

请参阅。
结果:

使用递归:

请参阅。
结果:


我不知道SQLite是否有可以帮助您的功能。您可以使用Python、PHP、Unix/Windows实用程序等编程语言从SQLite中提取数据并将其拆分。我不知道SQLite是否有可以帮助您的功能。您可以使用Python、PHP、Unix/Windows实用程序等编程语言从SQLite中提取数据并将其拆分。这太棒了。非常感谢。太棒了。非常感谢。非常感谢。我从你那里学到了不同的方法。我无法想象。但我只能使用SQL语句。♡这就是StackOverflow的美妙之处——相互学习不同的计算技术。用户
forpas
非常出色,递归CT的解决方案非常棒。谢谢。我从你那里学到了不同的方法。我无法想象。但我只能使用SQL语句。♡这就是StackOverflow的美妙之处——相互学习不同的计算技术。用户
forpas
非常出色,递归CT的解决方案非常棒。