sqlite: выбор с ОБЪЕДИНЕНИЕМ, когда другая таблица не существует

#sqlite

#sqlite

Вопрос:

У меня есть две базы данных sqlite3, в которых есть таблицы с идентичными схемами и (возможно) перекрывающимися данными. Например Temperature , таблица в обеих базах данных. Если я хочу объединить все столбцы из обеих таблиц, я сначала ATTACH использую другую базу данных:

 sqlite> ATTACH DATABASE 'old.sqlite' AS Old;
 

а затем объедините их UNION следующим образом:

 sqlite> SELECT * FROM Temperature UNION SELECT * FROM Old.Temperature;
 

Это работает нормально.

Однако иногда существует только одна таблица. Например, для влажности у меня может быть только один Humidity и ни одного аналога в другой базе данных. В этом случае запрос завершается ошибкой:

 sqlite> SELECT * FROM Humidity UNION SELECT * FROM Old.Humidity;
SQL error: no such table: Old.Humidity
 

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

Я заранее не знаю, какие таблицы существуют в каких базах данных. У меня есть только имена таблиц из всех баз данных, объединенных в один список. И часть кодовой базы, которая считывает данные, ожидает получить все столбцы в одном запросе.

Комментарии:

1. SELECT * FROM Humidity xD

2. Это приведет к сбою в случае, когда Old.Humidity на самом деле существует.

Ответ №1:

Невозможно создать запрос динамически в SQL. (SQLite предназначен для использования из приложения, написанного на «реальном» языке программирования.)

Вы должны заранее проверить, существует ли таблица (используйте PRAGMA table_info или попробуйте, работает ли запрос с использованием этой таблицы). Затем выполните запрос либо с ОБЪЕДИНЕНИЕМ, либо без него.

Комментарии:

1. Хорошо, спасибо. Я искал что-то похожее на INSERT OR IGNORE... , но похоже, что такого запроса не существует для SELECT

2. Вы могли бы выполнить CREATE TABLE IF NOT EXISTS Old.Humidity(... , но я думаю, вы не хотите изменять старую базу данных.