我有一个包含全名的 SQLITE 数据库(即父路径文件名,例如
C:\Users\Public\My Music\Classic Queen\16 - Who Wants to Live Forever.mp3
我想查询并获取与父路径分开的文件名。
在其他 SQL 实例中,我会使用反向来查找最后一个反斜杠,但 SQLITE 不支持它。之前的答案主要集中在外部脚本(python)中。我的问题是如何直接查询Sqlite。 (这很棘手,但我找到了一种方法来做到这一点,并且一旦发布问题,就会发布解决方案。)
附注, 我正在使用 AllDup 数据库,但这个问题并不是它独有的。
这可以在 sqlite 中通过一些“创造性”使用右修剪和字符串替换功能来实现。
# Table 'files' contain the fullname in the 'file' column
# .mode is set to line for readability
sqlite> SELECT
file AS fullname,
RTRIM(file, REPLACE(file, '\', '')) AS parentpath,
REPLACE(file,
RTRIM(file, REPLACE(file, '\', '')),
'') AS filename
FROM files
fullname = C:\Users\Public\Music\iTunes\iTunes Media\Music\Nirvana\Last Concert In Japan\16 Smells Like Teen Spirit.mp3
parentpath = C:\Users\Public\Music\iTunes\iTunes Media\Music\Nirvana\Last Concert In Japan\
filename = 16 Smells Like Teen Spirit.mp3
为什么这有效?我们通常将 rtrim 视为从源字符串末尾删除空格或指定修剪string的函数。因此
rtrim('abc','c') = ab
。
但是,它实际上正在匹配源字符串和修剪字符串末尾的任意顺序的所有字符。因此 rtrim('abc','dec') = ab
和
rtrim('abc','cb') = a
。知道了这一点,我们首先替换文件字符串中的路径分隔符,并根据原始字符串进行 rtrim。由于只有文件名部分匹配,因此它被删除——为我们提供了我们寻找的父路径。
然后我们替换原始字符串中的父路径——得到我们要查找的文件名。