Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLite中声明变量并使用它_Sql_Sqlite_Variables_Declaration - Fatal编程技术网

在SQLite中声明变量并使用它

在SQLite中声明变量并使用它,sql,sqlite,variables,declaration,Sql,Sqlite,Variables,Declaration,我想在SQLite中声明一个变量,并在insert操作中使用它 与MS SQL中类似: declare @name as varchar(10) set name = 'name' select * from table where name = @name 例如,我需要获取最后一行并在insert中使用它 我发现了一些关于绑定的东西,但我并没有完全理解它。尝试使用绑定值。不能像在T-SQL中那样使用变量,但可以使用参数。我希望下面的链接有用。SQLite不支持本机变量语法,但使用内存中的临时

我想在SQLite中声明一个变量,并在insert操作中使用它

与MS SQL中类似:

declare @name as varchar(10)
set name = 'name'
select * from table where name = @name
例如,我需要获取最后一行并在insert中使用它


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

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

SQLite不支持本机变量语法,但使用内存中的临时表可以实现几乎相同的语法

我在大型项目中使用了以下方法,效果非常好

    /* Create in-memory temp table for variables */
    BEGIN;

    PRAGMA temp_store = 2; /* 2 means use in-memory */
    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;

Herman的解决方案可行,但可以简化,因为Sqlite允许在任何字段上存储任何值类型

下面是一个更简单的版本,它使用一个声明为文本的值字段来存储任何值:

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

赫尔曼的解决方案对我有效,但是。。。把我搞糊涂了。我包括了我根据他的答案制作的演示。我的答案中的附加功能包括外键支持、自动递增键以及使用last_insert_rowid函数获取事务中最后一个自动生成的键

当我处理一个需要三个外键的事务时,我需要这些信息,但我只能得到最后一个带有last_insert_rowid的外键


对于只读变量(即一次设置并在查询中任何位置使用的常量值),请使用公共表表达式CTE

以常量作为名称,选择“名称”作为名称,10作为更多 选择table.cost、table.cost+const.more作为新成本 从表中,const 其中table.name=const.name
我找到了一种将变量分配到列或表的解决方案:

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和双引号之间输入一个空格
在双引号和类似内容之间,我理解其他解决方案不依赖于任何其他软件工具,但为什么不使用另一种可以与SQLite接口的编程语言,例如,或者?

sqlite不支持这一点。希望现在有更好的解决方案-2018年8月,您可以通过提供示例使您的答案更丰富。链接可以移动,但您的示例将在此处供将来参考。这些[]括号用于什么?@WindRider:避免与保留字发生冲突。这是我的一个习惯,但在这种情况下是不必要的,所以它们被删除了。这是有效的,但有几点值得注意的是,我在spatialite上尝试了这一点,它说你不能在事务中更改临时存储。另外,我认为您在BEGIN之后缺少一个分号。用于共享此解决方案的Tx。如何增加此值?我的意思是如何递增这个变量,就像它随顺序调用递增一样。临时表不能保证在内存中。这取决于编译器选项和PRAGMA temp_存储设置。事实上,根据,默认设置是将临时文件存储到磁盘,其中包括用于临时表和索引的文件。但是,如果要在比较中使用该值,则不应忘记将该值强制转换为正确的类型,否则可能会得到令人惊讶的结果。这是最优雅的答案。这是我正在寻找的答案类型。这应该是考虑到公认的答案,效果很好!简单而优雅,就是这样!感谢您提供了一个很好的示例,它确实比观点和链接有用得多
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,))