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

Ej.*_*Ej. 15 sqlite

例如,创建一个名为Car_Model具有表的外键的表的语法是什么(如果可能的话)Car_Make,并给出Car_Make一个列,该列是该表的Car_Models存在数Car_Make.

(如果这看起来很简单或像家庭作业一样,因为我只是在家里玩一些python试图重现我在工作中遇到的问题.我们在工作中使用MS-SQL.)

Dia*_*ami 27

SQLite不支持计算列.

但是,您可以使用相对简单的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
Run Code Online (Sandbox Code Playgroud)

这应该返回一个类似于以下的表

Name      Count
----      -----
Nissan    5
Toyota    20
Ford      10
Run Code Online (Sandbox Code Playgroud)


Luk*_*zda 11

我可以在 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
);
Run Code Online (Sandbox Code Playgroud)

重要的:

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

生成列的表达式可以引用同一行中的其他生成列,但没有生成列可以直接或间接依赖于自身。

这意味着您不能以依赖于原始问题中所述的其他表的方式创建计算列。因此,可行的解决方案是已经提出的视图或触发器。


小智 5

您可以应用触发器来执行此操作。在本例中,我在两个字段之间进行了划分。

CREATE TRIGGER [tUnitPrice] AFTER UPDATE OF [Price], [Qty] ON [tArticles] BEGIN
    UPDATE [tArticles]
    SET    [UnitPrice] = [tArticles].[Price] / [tArticles].[Qty]
    WHERE [rowId] = [NEW].[RowId]; END;
Run Code Online (Sandbox Code Playgroud)