Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/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:从SELECTWHERE查询创建blobs表_Sqlite_Blob_Converters - Fatal编程技术网

SQLite:从SELECTWHERE查询创建blobs表

SQLite:从SELECTWHERE查询创建blobs表,sqlite,blob,converters,Sqlite,Blob,Converters,是否有一种相当快速的方法将sqlite数据库表转换为另一个表,其中一列中共享相同值的所有行都被追加到一个字符串中,并存储为blob 比如: INSERT INTO new VALUES(<id>,blob) WHERE blob IN (SELECT blobber(*) FROM old WHERE id=<id>); 我必须补充一点,这不是唯一的,因为每个相同的实体可以有多个特性。因此,blobber中的序列化需要两个不同的分隔符。我相信以下内容可能符合您的要求:-

是否有一种相当快速的方法将sqlite数据库表转换为另一个表,其中一列中共享相同值的所有行都被追加到一个字符串中,并存储为blob

比如:

INSERT INTO new VALUES(<id>,blob) WHERE blob IN (SELECT blobber(*) FROM old WHERE id=<id>);

我必须补充一点,这不是唯一的,因为每个相同的实体可以有多个特性。因此,blobber中的序列化需要两个不同的分隔符。

我相信以下内容可能符合您的要求:-

CREATE TABLE IF NOT EXISTS newtable AS SELECT id,CAST(col1||col2||col3 AS BLOB) AS allcols FROM oldtable;
假设原始表中有3列,即col1、col2和col3
这没有WHERE子句,因为其中一列中共享相同值的所有行都不清楚/不明确。 考虑以下示例:

DROP TABLE IF EXISTS oldtable;
CREATE TABLE IF NOT EXISTS oldtable (id INTEGER PRIMARY KEY, col1 TEXT, col2 TEXT, col3 TEXT);
INSERT INTO oldtable (col1,col2,col3) VALUES 
    ('','',''),('A','B','C'),('123','123','123'),('C','D','E'),('456','456','456'),
    (x'00FF',x'01FE',x'02FD'),(x'00FF',x'00FF',x'00FF'),(x'00FF','ABC',x'FF00');
SELECT * FROM oldtable;
DROP TABLE IF EXISTS newtable;
CREATE TABLE IF NOT EXISTS newtable AS SELECT id,CAST(col1||col2||col3 AS BLOB) AS allcols FROM oldtable;
SELECT * FROM newtable;
第一个SELECT查询中的原始表:-

在新表二次选择查询时:-

补充再评论
因此,不可能使用一行将多行强制转换为一个blob 和一个列分隔符?或者通过构建一个中间表 如上所述,然后将同一id的所有ALLCOL转换为另一个id 桌子是全排的吗

是的,这是可能的,例如id列是multiple rows列。聚合函数group_concat与group BY子句可按如下方式使用:

DROP TABLE IF EXISTS oldtable;
CREATE TABLE IF NOT EXISTS oldtable (id INTEGER, col1 TEXT, col2 TEXT, col3 TEXT);
INSERT INTO oldtable (id,col1,col2,col3) VALUES 
    (1,'','',''),(2,'A','B','C'),(1,'123','123','123'),(2,'C','D','E'),(3,'456','456','456'),
    (2,x'00FF',x'01FE',x'02FD'),(3,x'00FF',x'00FF',x'00FF'),(4,x'00FF','ABC',x'FF00');
SELECT * FROM oldtable;
DROP TABLE IF EXISTS newtable;
CREATE TABLE IF NOT EXISTS newtable AS SELECT id,group_concat(CAST(col1||':'||col2||':'||col3 AS BLOB),'~') AS allcols FROM oldtable GROUP BY id;
SELECT * FROM newtable;
:用于分隔列~用于分隔行 以上结果分为4行

对于id=1的两行,为1, id=2的3行中为1, id=3的两行中的1 id为4的单行为1 根据:-


什么是blobber?在其中一列中共享相同值的所有行都被追加到一个字符串中,并存储为blobber。可以添加分隔符,使用| |符号时?@RadioControlled yes,例如col1 | |':“| | col2 | |':“| | col3表示冒号分隔符。因此,不可能使用行分隔符和列分隔符将多行强制转换为一个blob?或者,通过如上所述构建一个中间表,然后将同一id的所有allcol强制转换到另一个表的allrows?@RadioControlled,这是可能的,答案中添加了一个示例。