SQLite: создание таблицы BLOB-объектов из запроса SELECT WHERE - PullRequest
0 голосов
/ 02 июня 2019

Существует ли достаточно быстрый способ преобразования таблицы базы данных sqlite в другую таблицу, в которой все строки, имеющие одинаковое значение в одном из столбцов, добавляются в одну строку и сохраняются в виде большого двоичного объекта?

Что-то вроде:

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

Я должен добавить, что <id> - это не UNIQUE, поскольку каждый идентичный объект может иметь несколько функций.Поэтому для сериализации в blobber() потребуется два разных разделителя.

1 Ответ

2 голосов
/ 02 июня 2019

Я считаю, что следующее может быть таким, как вы хотите: -

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

Пока новая таблица (2-й запрос SELECT): -

enter image description here

Дополнительный комментарий

Так этоне возможно преобразовать несколько строк в один большой двоичный объект, используя строку и разделитель столбцов?Или, может быть, путем создания промежуточной таблицы, как указано выше, и последующего приведения всех аллоков для одного и того же идентификатора в стрелки другой таблицы?

Да, это возможно, например, в столбце 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 для 2 строк, где id = 1,
  • 1 для 3 строк, где id = 2,
  • 1 для2 строки, где id = 3
  • 1 для одной строки с идентификатором = 4

Согласно: -

enter image description here

...