Я хочу объявить переменную в SQLite и использовать ее в insert
работе.
Как в MS SQL:
declare @name as varchar(10)
set name = 'name'
select * from table where name = @name
Например, мне нужно будет получить last_insert_row
и использовать его в insert
.
Я кое-что нашел о привязке, но не совсем понял это.
sql
sqlite
variables
declaration
Мухаммад Нур
источник
источник
Ответы:
SQLite не поддерживает собственный синтаксис переменных, но вы можете добиться того же, используя временную таблицу в памяти.
Я использовал нижеприведенный подход для больших проектов, и он отлично работает.
/* Create in-memory temp table for variables */ BEGIN; PRAGMA temp_store = 2; CREATE TEMP TABLE _Variables(Name TEXT PRIMARY KEY, RealValue REAL, IntegerValue INTEGER, BlobValue BLOB, TextValue TEXT); /* Declaring a variable */ INSERT INTO _Variables (Name) VALUES ('VariableName'); /* Assigning a variable (pick the right storage class) */ UPDATE _Variables SET IntegerValue = ... WHERE Name = 'VariableName'; /* Getting variable value (use within expression) */ ... (SELECT coalesce(RealValue, IntegerValue, BlobValue, TextValue) FROM _Variables WHERE Name = 'VariableName' LIMIT 1) ... DROP TABLE _Variables; END;
источник
PRAGMA temp_store
настройки. Фактически, согласно онлайн-документации , настройка по умолчанию - временное хранение файлов на диск (который включает файлы для временных таблиц и индексов).Решение Германа работает, но его можно упростить, потому что Sqlite позволяет хранить любой тип значения в любом поле.
Вот более простая версия, в которой используется одно
Value
поле, объявленноеTEXT
для хранения любого значения:CREATE TEMP TABLE IF NOT EXISTS Variables (Name TEXT PRIMARY KEY, Value TEXT); INSERT OR REPLACE INTO Variables VALUES ('VarStr', 'Val1'); INSERT OR REPLACE INTO Variables VALUES ('VarInt', 123); INSERT OR REPLACE INTO Variables VALUES ('VarBlob', x'12345678'); SELECT Value FROM Variables WHERE Name = 'VarStr' UNION ALL SELECT Value FROM Variables WHERE Name = 'VarInt' UNION ALL SELECT Value FROM Variables WHERE Name = 'VarBlob';
источник
Для переменной, доступной только для чтения (то есть постоянного значения, установленного один раз и используемого в любом месте запроса), используйте Common Table Expression (CTE).
WITH const AS (SELECT 'name' AS name, 10 AS more) SELECT table.cost, (table.cost + const.more) AS newCost FROM table, const WHERE table.name = const.name
Предложение SQLite WITH
источник
Решение Германа сработало для меня, но
...
меня немного запутали. Я включаю демонстрацию, которую разработал на основе его ответа. Дополнительные функции в моем ответе включают поддержку внешнего ключа, автоматическое увеличение ключей и использованиеlast_insert_rowid()
функции для получения последнего автоматически сгенерированного ключа в транзакции.Моя потребность в этой информации возникла, когда я попал в транзакцию, для которой требовалось три внешних ключа, но я мог получить только последний
last_insert_rowid()
.PRAGMA foreign_keys = ON; -- sqlite foreign key support is off by default PRAGMA temp_store = 2; -- store temp table in memory, not on disk CREATE TABLE Foo( Thing1 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ); CREATE TABLE Bar( Thing2 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(Thing2) REFERENCES Foo(Thing1) ); BEGIN TRANSACTION; CREATE TEMP TABLE _Variables(Key TEXT, Value INTEGER); INSERT INTO Foo(Thing1) VALUES(2); INSERT INTO _Variables(Key, Value) VALUES('FooThing', last_insert_rowid()); INSERT INTO Bar(Thing2) VALUES((SELECT Value FROM _Variables WHERE Key = 'FooThing')); DROP TABLE _Variables; END TRANSACTION;
источник
Попробуйте использовать значения привязки. Вы не можете использовать переменные, как в T-SQL, но можете использовать «параметры». Надеюсь, следующая ссылка окажется полезной. Обязательные значения
источник