C++, SQL, SQLite

Аналог UNNEST в SQLite

Такой удобной функции, как UNNEST, в SQLite нет (пссс, об UNNEST в PostgreSQL я писала вот здесь). А что использовать, если нам нужно элементы некоего массива/списка/контейнера впихнуть в один запрос вставки данных, например? Можно воспользоваться WITH и VALUES.

Предположим, у нас есть два списка — список кодов и список соответствующих им дат. Можно коды и даты скомпоновать сразу парами, можно — раздельно. В каких-то конкретных случаях будут разные ситуации.

with cte_code(id,code) as (
select rowid, a.* from 
	(values('111'),('222'),('333')) as a),
cte_dates(id,date) as (
select rowid, b.* from 
	(values('2022-08-09'),('2022-08-10'),
	 ('2022-08-11')) as b)

insert into ones(task_id, code, date)
select 1, a.code, b.date
from cte_code a 
inner join cte_dates b on b.id = a.id
Списки поотдельности

cte_code — список кодов, cte_dates — список дат. task_id — некая константа.

with cte_pairs(code, date) as (
select * from 
	(values('111', '2022-08-09'),
	 ('222', '2022-08-10'),
	 ('333', '2022-08-11')))

insert into ones(task_id, code, date)
select 1, a.code, a.date
from cte_pairs a
Спарованный список

cte_pairs — оба наших списка в одном.

Строка запроса в Qt C++, учитывая наличие QStringList codes и QStringList dates, может выглядеть так:

QStringList codes, dates;
QString qry = QString("with cte_code(id,code) as ( "
					  "select rowid, a.* from "
					  "(values('%2')) as a), "
					  "cte_dates(id,date) as ( "
					  "select rowid, b.* "
					  "from (values('%1')) as b) "
					  
					  "insert into ones(task_id, code, date) "
					  "select 1, a.code, b.date "
					  "from cte_code a "
					  "inner join cte_dates b on b.id = a.id")
	.arg(dates.join("'), ('"))
	.arg(codes.join("'), ('"));