C++, SQL, SQLite

Аналог UNNEST в SQLite

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

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

[pastacode lang=»sql» manual=»with%20cte_code(id%2Ccode)%20as%20(%0Aselect%20rowid%2C%20a.*%20from%20%0A%09(values(‘111’)%2C(‘222’)%2C(‘333’))%20as%20a)%2C%0Acte_dates(id%2Cdate)%20as%20(%0Aselect%20rowid%2C%20b.*%20from%20%0A%09(values(‘2022-08-09’)%2C(‘2022-08-10’)%2C%0A%09%20(‘2022-08-11’))%20as%20b)%0A%0Ainsert%20into%20ones(task_id%2C%20code%2C%20date)%0Aselect%201%2C%20a.code%2C%20b.date%0Afrom%20cte_code%20a%20%0Ainner%20join%20cte_dates%20b%20on%20b.id%20%3D%20a.id» message=»Списки поотдельности» highlight=»1,4,9″ provider=»manual»/]

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

[pastacode lang=»sql» manual=»with%20cte_pairs(code%2C%20date)%20as%20(%0Aselect%20*%20from%20%0A%09(values(‘111’%2C%20’2022-08-09’)%2C%0A%09%20(‘222’%2C%20’2022-08-10’)%2C%0A%09%20(‘333’%2C%20’2022-08-11’)))%0A%0Ainsert%20into%20ones(task_id%2C%20code%2C%20date)%0Aselect%201%2C%20a.code%2C%20a.date%0Afrom%20cte_pairs%20a» message=»Спарованный список» highlight=»1″ provider=»manual»/]

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

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

[pastacode lang=»cpp» manual=»QStringList%20codes%2C%20dates%3B%0AQString%20qry%20%3D%20QString(%22with%20cte_code(id%2Ccode)%20as%20(%20%22%0A%09%09%09%09%09%20%20%22select%20rowid%2C%20a.*%20from%20%22%0A%09%09%09%09%09%20%20%22(values(‘%252’))%20as%20a)%2C%20%22%0A%09%09%09%09%09%20%20%22cte_dates(id%2Cdate)%20as%20(%20%22%0A%09%09%09%09%09%20%20%22select%20rowid%2C%20b.*%20%22%0A%09%09%09%09%09%20%20%22from%20(values(‘%251′))%20as%20b)%20%22%0A%09%09%09%09%09%20%20%0A%09%09%09%09%09%20%20%22insert%20into%20ones(task_id%2C%20code%2C%20date)%20%22%0A%09%09%09%09%09%20%20%22select%201%2C%20a.code%2C%20b.date%20%22%0A%09%09%09%09%09%20%20%22from%20cte_code%20a%20%22%0A%09%09%09%09%09%20%20%22inner%20join%20cte_dates%20b%20on%20b.id%20%3D%20a.id%22)%0A%09.arg(dates.join(%22’)%2C%20(‘%22))%0A%09.arg(codes.join(%22’)%2C%20(‘%22))%3B» message=»» highlight=»» provider=»manual»/]