SQLite:从 SELECT WHERE 查询创建 blob table
SQLite: Create blobs table from SELECT WHERE query
是否有一种相当快速的方法可以将 sqlite 数据库 table 转换为另一个 table,其中其中一列中共享相同值的所有行都附加到一个字符串中并存储为 blob ?
类似于:
INSERT INTO new VALUES(<id>,blob) WHERE blob IN (SELECT blobber(*) FROM old WHERE id=<id>);
我必须补充一点,<id>
不是 UNIQUE
,因为每个相同的实体都可以有多个特征。因此 blobber()
中的序列化需要两个不同的分隔符。
我相信以下内容可能符合您的要求:-
CREATE TABLE IF NOT EXISTS newtable AS SELECT id,CAST(col1||col2||col3 AS BLOB) AS allcols FROM oldtable;
- 假设原table中有3列,即col1、col2和col3
- 这没有 WHERE 子句,因为 其中一列中的所有行共享相同的值 是 unclear/ambiguous。
考虑以下示例:
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;
原文table(第一个SELECT查询):-
而新 table(第 2 个 SELECT 查询):-
补充评论
So it is not possible to cast mutiple rows into one blob using a row
and a column separator? Or perhaps by building an intermediate table
as above and then casting all allcols for the same id into another
table's allrows?
是的,这是可能的,例如,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 行
- 1 表示 id = 1 的 2 行,
- 1 表示 3 行,其中 id = 2,
- 1 表示 id = 3 的 2 行
- 1 表示 id = 4 的单行
根据 :-
是否有一种相当快速的方法可以将 sqlite 数据库 table 转换为另一个 table,其中其中一列中共享相同值的所有行都附加到一个字符串中并存储为 blob ?
类似于:
INSERT INTO new VALUES(<id>,blob) WHERE blob IN (SELECT blobber(*) FROM old WHERE id=<id>);
我必须补充一点,<id>
不是 UNIQUE
,因为每个相同的实体都可以有多个特征。因此 blobber()
中的序列化需要两个不同的分隔符。
我相信以下内容可能符合您的要求:-
CREATE TABLE IF NOT EXISTS newtable AS SELECT id,CAST(col1||col2||col3 AS BLOB) AS allcols FROM oldtable;
- 假设原table中有3列,即col1、col2和col3
- 这没有 WHERE 子句,因为 其中一列中的所有行共享相同的值 是 unclear/ambiguous。
考虑以下示例:
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;
原文table(第一个SELECT查询):-
而新 table(第 2 个 SELECT 查询):-
补充评论
So it is not possible to cast mutiple rows into one blob using a row and a column separator? Or perhaps by building an intermediate table as above and then casting all allcols for the same id into another table's allrows?
是的,这是可能的,例如,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 行
- 1 表示 id = 1 的 2 行,
- 1 表示 3 行,其中 id = 2,
- 1 表示 id = 3 的 2 行
- 1 表示 id = 4 的单行
根据 :-