如何通过子查询使用SQLite zipfile扩展读取数据库中的Zip Blob?
SQLite中如何将Blob列传入zipfile函数获取压缩包内文件名
问题场景
已将Zip文件以Blob形式存储在SQLite数据库,表结构与插入语句如下:
CREATE TABLE zip_blob( name TEXT, contents BLOB );
INSERT INTO zip_blob( name, contents ) VALUES( 'data.zip', readfile('path/to/data.zip') );
尝试用zipfile()函数列出Blob中压缩包的文件名时,执行以下语句报错:
SELECT name FROM zipfile(SELECT contents FROM zip_blob WHERE name is 'data.zip');
报错信息:
Parse error: near "SELECT": syntax error SELECT name FROM zipfile(SELECT contents FROM zip_blob WHERE name is 'data.zip error here ---
注意:原Zip文件已不存在,无法使用zipfile(readfile(...))的方式。
解决方案
SQLite的zipfile()函数需要接收单个Blob值作为参数,不能直接嵌套未包裹的SELECT子查询,需将内部查询转为标量子查询(确保返回单行单列的Blob数据),有两种可行写法:
写法1:给内部SELECT添加外层括号
SELECT name FROM zipfile( (SELECT contents FROM zip_blob WHERE name = 'data.zip') );
括号明确告知SQLite这是一个返回单个值的子查询表达式,避免语法解析错误。
写法2:使用JOIN关联表与zipfile结果
SELECT z.name FROM zip_blob b, zipfile(b.contents) z WHERE b.name = 'data.zip';
这种方式通过表别名直接引用Blob列,更直观,同时确保只处理目标行的Blob数据。
内容的提问来源于stack exchange,提问作者sakra
相关产品推荐
相关产品推荐

