web-dev-qa-db-fra.com

Déclarer une variable dans SQLite et l'utiliser

Je veux déclarer une variable dans SQLite et l'utiliser dans l'opération insert.

Comme dans MS SQL:

declare @name as varchar(10)
set name = 'name'
select * from table where name = @name

Par exemple, je devrai obtenir last_insert_row et l’utiliser dans insert.

J'ai trouvé quelque chose à propos de la liaison mais je ne l'ai pas vraiment bien compris.

81
Muhammad Nour

SQLite ne prend pas en charge la syntaxe de variable native, mais vous pouvez obtenir pratiquement la même chose en utilisant une table temporaire en mémoire.

J'ai utilisé l'approche ci-dessous pour les grands projets et fonctionne à merveille.

    /* 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;
86
Herman Schoenfeld

La solution de Herman fonctionne, mais elle peut être simplifiée car Sqlite permet de stocker n'importe quel type de valeur sur n'importe quel champ.

Voici une version plus simple qui utilise un champ Value déclaré comme TEXT pour stocker une valeur quelconque:

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';
41
stenci

La solution de Herman a fonctionné pour moi, mais le ... M'a un peu mélangé. J'inclus la démo que j'ai préparée en fonction de sa réponse. Les fonctionnalités supplémentaires de ma réponse incluent la prise en charge des clés étrangères, l'incrémentation automatique des clés et l'utilisation de la fonction last_insert_rowid() pour obtenir la dernière clé générée automatiquement dans une transaction.

Mon besoin de cette information est apparu lorsque j'ai effectué une transaction nécessitant trois clés étrangères, mais je n'ai pu obtenir la dernière qu'avec 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;
9
ThisClark

Pour les variables en lecture seule (utilisant la même valeur dans toute la requête), utilisez une expression de table commune (CTE).

WITH var AS (SELECT 'name' AS name, 10 AS more)
SELECT *, (table.cost + var.more) AS result 
FROM table, var 
WHERE table.name = var.name

clause SQLite WITH

1
DenverCR

Essayez d'utiliser des valeurs de liaison. Vous ne pouvez pas utiliser de variables comme dans T-SQL, mais vous pouvez utiliser des "paramètres". J'espère que le lien suivant est utile . Binding Values

1
Unfamiliar