是否存在一种将sqlite数据库表转换为另一表的合理快速方法,在该表中,其中一个列中共享相同值的所有行都附加到一个字符串中并存储为blob?
类似的东西:
INSERT INTO new VALUES(<id>,blob) WHERE blob IN (SELECT blobber(*) FROM old WHERE id=<id>);
我必须补充一点,<id>
不是UNIQUE
,因为每个相同的实体都可以具有多个功能。因此,blobber()
中的序列化将需要两个不同的分隔符。
答案 0 :(得分:2)
我相信以下内容可能符合您的要求:-
CREATE TABLE IF NOT EXISTS newtable AS SELECT id,CAST(col1||col2||col3 AS BLOB) AS allcols FROM oldtable;
考虑以下示例:
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查询):-
新建表(第二个SELECT查询):-
因此不可能使用一行将多个行转换为一个blob 和柱分隔符?或者通过建立一个中间表 如上,然后将相同id的所有allcol转换为另一个 桌子的桌子?
是的,例如 id 列是多行列的示例。聚合函数 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行
按照:-