在sqlite中声明变量并使用它

时间:2011-10-12 11:34:31

标签: sql sqlite variables declaration

我想在sqlite中声明一个变量并在插入操作中使用它

就像在MS SQL中一样

Declare @name as varchar(10)

set name = 'name'

Select * from table where name = @name

例如,我需要获取last_insert_row并在insert

中使用它

我找到了一些关于绑定的东西,但我并没有完全理解它

7 个答案:

答案 0 :(得分:84)

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;

答案 1 :(得分:41)

Herman的解决方案有效,但可以简化,因为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';

答案 2 :(得分:8)

赫尔曼的解决方案对我有用,但...让我混淆了一下。我包括我根据他的回答编写的演示。我的答案中的其他功能包括外键支持,自动递增键,以及使用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;

答案 3 :(得分:1)

尝试使用绑定值。您不能像在T-SQL中那样使用变量,但可以使用“参数”。我希望以下链接有用。Binding Values

答案 4 :(得分:1)

我很欣赏其他解决方案不依赖于任何其他软件工具,但为什么不使用另一种可以与 SQLite 接口的编程语言,例如 C#C++GoHaskellJavaLuaPythonRust

答案 5 :(得分:0)

对于只读变量(在整个查询中使用相同的值),请使用通用表表达式(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

SQLite WITH clause

答案 6 :(得分:-1)

我找到了一种将变量分配给COLUMN或TABLE的解决方案:

conn = sqlite3.connect('database.db')
cursor=conn.cursor()
z="Cash_payers"   # bring results from Table 1 , Column: Customers and COLUMN 
# which are pays cash
sorgu_y= Customers #Column name
query1="SELECT  * FROM  Table_1 WHERE " +sorgu_y+ " LIKE ? "
print (query1)
query=(query1)
cursor.execute(query,(z,))

不要忘记在WHERE和双引号之间输入一个空格 在双引号和LIKE之间