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中创建计算列吗?_Sqlite_Calculated Columns - Fatal编程技术网

我可以在SQLite中创建计算列吗?

我可以在SQLite中创建计算列吗?,sqlite,calculated-columns,Sqlite,Calculated Columns,语法是什么(如果可能的话),例如,创建一个名为Car\u Model的表,它有一个表Car\u Make的外键,并给Car\u Make一列,该列是该Car\u Make存在的Car\u Models (如果这看起来很琐碎,或者是因为我只是在家里玩一些python,试图重现我在工作中遇到的问题。我们在工作中使用MS-SQL。)更新:从版本3.31.0(于2020-01-22发布)开始,下面的答案适用于3.31.0之前的版本 SQLite不支持计算列 SELECT Car_Make.Name, C

语法是什么(如果可能的话),例如,创建一个名为
Car\u Model
的表,它有一个表
Car\u Make
的外键,并给
Car\u Make
一列,该列是该
Car\u Make
存在的
Car\u Models


(如果这看起来很琐碎,或者是因为我只是在家里玩一些python,试图重现我在工作中遇到的问题。我们在工作中使用MS-SQL。)

更新:从版本3.31.0(于2020-01-22发布)开始,下面的答案适用于3.31.0之前的版本

SQLite不支持计算列

SELECT Car_Make.Name, Count(*) AS Count 
FROM Car_Make, Car_Model 
WHERE Car_Make.Id = Car_Model.Make 
GROUP BY Car_Make.Name
然而,您的问题可以通过一个相对简单的SQL查询来解决,然后您可以创建一个视图,使其看起来像一个带有额外计算列的表

SELECT Car_Make.Name, Count(*) AS Count 
FROM Car_Make, Car_Model 
WHERE Car_Make.Id = Car_Model.Make 
GROUP BY Car_Make.Name
这将返回一个类似于以下内容的表

Name      Count
----      -----
Nissan    5
Toyota    20
Ford      10

您可以应用触发器来执行此操作。在这种情况下,我在两个字段之间应用除法

CREATE TRIGGER [tUnitPrice] AFTER UPDATE OF [Price], [Qty] ON [tArticles] BEGIN
    UPDATE [tArticles]
    SET    [UnitPrice] = [tArticles].[Price] / [tArticles].[Qty]
    WHERE [rowId] = [NEW].[RowId]; END;
我可以在SQLite中创建计算列吗

是的,这是可能的。此功能是在2020-01-22-SQLite 3.31.0上添加的

生成的列(有时也称为“计算列”)是表中的列,其值是同一行中其他列的函数。可以读取生成的列,但不能直接写入它们的值。更改生成列的值的唯一方法是修改用于计算生成列的其他列的值

CREATE TABLE t1(
   a INTEGER PRIMARY KEY,
   b INT,
   c TEXT,
   d INT GENERATED ALWAYS AS (a*abs(b)) VIRTUAL,
   e TEXT GENERATED ALWAYS AS (substr(c,b,b+1)) STORED
);
重要提示:

生成列的表达式只能引用常量 同一行中的文字和列,并且只能使用标量 确定性函数表达式不能使用子查询, 聚合函数、窗口函数或表值函数。

生成列的表达式可以引用其他生成列 同一行中的列,但生成的列不能依赖于 它本身,直接或间接地

这意味着您不能创建一个计算列,因为它将依赖于原始问题中所述的其他表。因此,可行的解决方案是已经提出的观点或触发点