SQLite:从SELECT WHERE查询创建blobs表

时间:2019-06-02 07:46:14

标签: sqlite blob converters

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

类似的东西:

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

我必须补充一点,<id>不是UNIQUE,因为每个相同的实体都可以具有多个功能。因此,blobber()中的序列化将需要两个不同的分隔符。

1 个答案:

答案 0 :(得分:2)

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

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查询):-

enter image description here

新建表(第二个SELECT查询):-

enter image description here

其他评论

  

因此不可能使用一行将多个行转换为一个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行

  • 对于2行,其中id = 1,为1
  • 1行3行,其中id = 2,
  • 在ID = 3的2行中为1
  • 对于ID为4的单行为1

按照:-

enter image description here