Chcę zadeklarować zmienną w SQLite i używać jej w insert
działaniu.
Podobnie jak w MS SQL:
declare @name as varchar(10)
set name = 'name'
select * from table where name = @name
Na przykład będę musiał go pobrać last_insert_row
i użyć w insert
.
Znalazłem coś na temat wiązania, ale nie do końca to zrozumiałem.
sql
sqlite
variables
declaration
Muhammad Nour
źródło
źródło
Odpowiedzi:
SQLite nie obsługuje natywnej składni zmiennych, ale możesz osiągnąć praktycznie to samo, używając tabeli tymczasowej w pamięci.
Użyłem poniższego podejścia do dużych projektów i działa jak urok.
/* 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;
źródło
PRAGMA temp_store
ustawienia. W rzeczywistości, zgodnie z dokumentacją online , domyślnym ustawieniem jest tymczasowe przechowywanie plików na dysku (co obejmuje pliki tymczasowych tabel i indeksów).Rozwiązanie Hermana działa, ale można je uprościć, ponieważ Sqlite umożliwia przechowywanie dowolnego typu wartości w dowolnym polu.
Oto prostsza wersja, która używa jednego
Value
pola zadeklarowanego jakoTEXT
do przechowywania dowolnej wartości: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';
źródło
W przypadku zmiennej tylko do odczytu (czyli stałej ustawionej raz i używanej w dowolnym miejscu w zapytaniu) użyj wspólnego wyrażenia tabelowego (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
Klauzula SQLite WITH
źródło
Rozwiązanie Hermana zadziałało dla mnie, ale
...
trochę mnie pomieszało. Załączam wersję demonstracyjną, którą opracowałem na podstawie jego odpowiedzi. Dodatkowe funkcje w mojej odpowiedzi obejmują obsługę kluczy obcych, automatyczne zwiększanie kluczy i użycielast_insert_rowid()
funkcji w celu uzyskania ostatniego automatycznie wygenerowanego klucza w transakcji.Moje zapotrzebowanie na te informacje pojawiło się, gdy trafiłem na transakcję wymagającą trzech kluczy obcych, ale mogłem uzyskać tylko ostatni z nich
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;
źródło
Spróbuj użyć wartości wiążących. Nie możesz używać zmiennych, tak jak w T-SQL, ale możesz używać „parametrów”. Mam nadzieję, że poniższy link jest przydatny. Wiążące wartości
źródło