Postgres 12+ 支持生成列:https://www.postgresql.org/docs/current/ddl- generated-columns.html
从文档来看,语法似乎受到限制 - 它强制人们显式命名生成列所依赖的列。
CREATE TABLE people (
...,
height_cm numeric,
height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED
);
Run Code Online (Sandbox Code Playgroud)
有没有办法将整行传递给生成函数?就像是
CREATE TABLE people (
...,
height_cm numeric,
height_in numeric GENERATED ALWAYS AS generator_function(current_row) STORED
);
Run Code Online (Sandbox Code Playgroud) 我有一个这样的表:
CREATE TABLE
dbo.DiscountBarcodeList
(
ID int NOT NULL IDENTITY
CONSTRAINT PK_DiscountBarcodeList
PRIMARY KEY CLUSTERED
, Discount int NOT NULL
CONSTRAINT FK_DiscountBarcodeList_Discount
FOREIGN KEY REFERENCES dbo.Discount (ID)
, CodeNumber int NOT NULL
, AssignedEntity int NULL
CONSTRAINT FK_DiscountBarcodeList_AssignedEntity
FOREIGN KEY REFERENCES dbo.Entity (ID)
ON DELETE SET NULL
, BarcodeID AS
CONVERT(
char(10)
, CAST(Discount AS binary(2)) + CAST(CodeNumber AS binary(3))
, 2)
, CONSTRAINT UQ_DiscountBarcodeList_DiscountCodeNumber
UNIQUE NONCLUSTERED
(
Discount ASC
, CodeNumber ASC
)
);
Run Code Online (Sandbox Code Playgroud)
该表将保存预先CodeNumber分配给 s 的 …
index sql-server sql-server-2014 unique-constraint computed-column
如何在 MySQL 版本 5 中创建带有公式列的表?
例如:我有一个名为 的表Product,它有 5 列:
id int,
amount int,
sold_out int,
faulty int,
remain_amount is (amount-(sold_out+faulty))
Run Code Online (Sandbox Code Playgroud)
我不会使用触发器或视图。
我正在寻找类似于在 SQL Server 中称为计算列的解决方案。
我在 SQL Server 2008R2 中有一个查询,我想针对计算列运行该查询,而我又要对计算列进行索引 - 以加快速度。
该列现在是 int 类型。
我无法正确使用语法。
alter table dbo.tOutput Add StateNew as State IN (0, 10)
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
Incorrect syntax near the keyword 'IN'.
Run Code Online (Sandbox Code Playgroud)
来自 C# 实体框架的查询应该稍后使用索引并且 - 很好 - 很快。
C#好像改成IN用法了,原来是这样的:
tOutput.Where(x => (x.State == 0) || (x.State == 10))
Run Code Online (Sandbox Code Playgroud)
生成的 SQL 读取
.. FROM tOutput WHERE State IN (0, 10) ..
Run Code Online (Sandbox Code Playgroud) 我有一个事件表,聚集索引是创建日期/时间。
通常情况下,在同一毫秒内永远不会发生两个事件,但会发生异常事件,因此该列不一定是唯一的。
我想添加一个 uniquifier 列,即在给定时间内插入的第一个行为 0,第二个为 1,依此类推:
TIME UNIQUIFIER, TEXT
2018-01-01 01:23:45.678, 0, "aaa"
2018-01-01 02:00:00.000, 0, "bbb"
2018-01-01 02:00:00.000, 1, "ccc"
2018-01-01 02:00:00.000, 2, "ddd"
2018-01-01 03:45:67.890, 0, "eee"
Run Code Online (Sandbox Code Playgroud)
我知道当我创建聚集索引时,MS Sql Server 会自动创建这样一个列。但是该列是隐藏的。
我想要一个可见的 uniquifier,它的行为就像这个隐藏的一样,所以我可以在外键关系中使用它。
也就是说,当...
...我可以Time:2018-01-01 02:00:00 / Uniquifier:0用作外键,知道该行存在,而无需在第一个表中查找事件。
我可以使用自动递增的标识列来使键唯一,但这意味着我无法在不知道标识列的情况下引用事件。
例如,如果我想在单独的 1-n 表中创建事件和一堆额外的事件信息,我必须首先创建事件,然后查找其标识列,然后才创建相关信息,使用它身份栏。我试图避免往返。
是否有可能在 SQL Server 中使用自动值填充这样一个可见的列,与隐藏的 uniquifier 列相同?
还是在插入行时必须手动计算这样的列?
sql-server sql-server-2014 unique-constraint computed-column
有谁知道如何创建一个哈希计算列持久化?我不断收到以下错误。否则,我将不得不每次都使用更新或触发语句。我知道如何进行单列,但是现在这包括多列。
CREATE TABLE [dbo].[CustomerTransactiont]
(
CustomerTransactionId int primary key identity(1,1),
CustomerName varchar(255),
Price decimal(10,2),
Quantity int,
RowHash as hashbytes('SHA2_512', (select CustomerName
,Price
,Quantity for xml raw)) persisted
)
Msg 1046, Level 15, State 1, Line 7
Subqueries are not allowed in this context. Only scalar expressions are allowed.
Run Code Online (Sandbox Code Playgroud) 在 PostgreSQL 中如何刷新存储的生成列的值。
CREATE TABLE people (
first_name TEXT,
last_name TEXT
);
CREATE OR REPLACE FUNCTION name(people) RETURNS text AS
$$
SELECT $1.first_name || ' ' || $1.last_name
$$ LANGUAGE SQL STRICT
IMMUTABLE
;
alter table people add column full_name text GENERATED ALWAYS AS (name(people)) STORED;
insert into people(first_name, last_name) values('John', 'Smith');
select full_name, full_name='John Smith' as pass from people;
Run Code Online (Sandbox Code Playgroud)
如果需要更改用于生成存储列值的函数,在这种情况下name如何要求 postgres 重新计算这些字段。
例如。
CREATE OR REPLACE FUNCTION name(people) RETURNS text AS
$$
SELECT $1.first_name || ' …Run Code Online (Sandbox Code Playgroud) 我在 PostgreSQL 13 中有这个表:
CREATE TABLE public."domain" (
id int8 NOT NULL GENERATED ALWAYS AS IDENTITY,
domain_name varchar NOT NULL,
-- more columns
expire_date timestamp NULL,
days_before_trigger int4 NOT NULL DEFAULT 14
);
Run Code Online (Sandbox Code Playgroud)
现在我想添加一个生成的列notify_trigger_date,派生自expire_date减days_before_trigger,以记录我的网站 url ssl 证书到期日期。如何自动生成该列?
它看起来像这样:
notify_trigger_date = expire_date - 7 day
Run Code Online (Sandbox Code Playgroud)
我正在尝试像这样实现它:
ALTER TABLE "domain" ADD COLUMN notify_trigger_date timestamp
GENERATED ALWAYS AS ((expire_date::timestamp - '1 day')) STORED;
Run Code Online (Sandbox Code Playgroud)
我不知道如何1 day用天数替换days_before_trigger?此命令运行时出错:
Run Code Online (Sandbox Code Playgroud)SQL Error [22007]: ERROR: invalid input syntax for …
我的表中有两个字段:A int, B int。我想添加两个使用这两个字段& 的计算字段 ( CF1& CF2) 。AB
CF1 = (case when [A]>[B] then (CF1=3) else case when [A]<[B] then (CF1=0) else (CF1=1) end end)
CF2 = (case when [A]<[B] then (CF2=3) else case when [A]>[B] then (CF2=0) else (CF2=1) end end)
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是当两个字段 ( A& B) 是NULL,CF1并且CF2是 = 1 时。如何避免这种情况?我的意思是,当领域中的任意一个A或者B是NULL,无论CF1和CF2也应该是NULL。
换句话说:应该只有在0,1或3的值CF1和 …
我在表中添加了一个计算字段,并且只想更新NULL行(或“新”行)。出了点问题,DateTime当插入 1 行时,我的表中的每一行都用当前更新。这是Create Table语法,我必须做什么才能仅使用当前更新“新”行DateTime
CREATE TABLE [dbo].[SE](
[dbID] [int] IDENTITY(1,1) NOT NULL,
[uqID] [varchar](31) NOT NULL,
[POD] [varchar](255) NULL,
[EC] [varchar](255) NULL,
[S1] [varchar](35) NULL,
[S2] [varchar](35) NULL,
[S3] [varchar](35) NULL,
[S4] [varchar](35) NULL,
[S5] [varchar](35) NULL,
[S6] [varchar](35) NULL,
[S7] [varchar](35) NULL,
[PSD] [varchar](50) NULL,
[DS] [datetime] NULL,
[CN] [varchar](max) NULL,
[autodate] AS (getdate()),
PRIMARY KEY CLUSTERED
(
[dbID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = …Run Code Online (Sandbox Code Playgroud) sql-server t-sql sql-server-2008-r2 default-value computed-column
我正在考虑最好的方法来做到这一点。如果我在 sql server 中有这样的表:
StudentPointsTable
StudentID
TestDate
Points
我还需要为学生计算平均值和标准差。我知道我可以创建一个视图,或者用这些计算列创建一个新表,或者将计算列添加到这个表中。
不确定是否还有其他选择,但在性能方面,最好的方法是什么?
我有一个具有以下结构的表:
ItemID int
ItemType char(1)
Language char(2)
Localization char(2)
Literal nvarchar(4000)
Run Code Online (Sandbox Code Playgroud)
用于将特定的文本翻译ItemID为Literal一个。该Literal列可能包含HTML标签。对于一组特定的查询,HTML需要删除这些标记,并且因为清理是使用 SQL CLR 对数千行完成的,所以我不想在读取时执行此类操作。
所以,我添加了一个像这样的持久列:
ALTER TABLE [dbo].[table]
ADD [LiteralSanitized] AS NULLIF(CAST(LTRIM(RTRIM([dbo].[fn_Utils_RemoveAllHtmlTags] ([Literal]))) AS NVARCHAR(4000)), '') PERSISTED;
Run Code Online (Sandbox Code Playgroud)
该表只有一个索引(主键),定义如下:
ItemID, ItemType, Language, Localization
Run Code Online (Sandbox Code Playgroud)
所以查询速度更快,但我看到这个表有一些额外的读取:
Scan count - 2 vs 12,230
Logical reads - 3,234 vs 43,472
Run Code Online (Sandbox Code Playgroud)
这可能是正常的,因为现在我因为该列而读取了更多数据。所以,我添加了以下索引:
(ItemID ASC, ItemType ASC, Language ASC, Localization ASC) INCLUDE ([LiteralSanitized])
Run Code Online (Sandbox Code Playgroud)
但它不被引擎使用。所以,我尝试强制引擎使用它:
UPDATE #temp
SET [QuestionText] = PSGQ.[LiteralSanitized]
FROM #temp PQD
INNER JOIN [dbo].[table_with_translations] …Run Code Online (Sandbox Code Playgroud) 我有一个现有的ASSET_SUMMARY_VW观点:
+-----------------------+---------------+
| ASSET_TYPE | COST |
+-----------------------+---------------+
| TRANSPORTATION | 1,000,000,000 |
| TRANSPORTATION | 500,000,000 |
| TRANSPORTATION | 500,000,000 |
| ACTIVE TRANSPORTATION | 100,000,000 |
| ACTIVE TRANSPORTATION | 50,000,000 |
| STORMWATER MANAGEMENT | 500,000,000 |
+-----------------------+---------------+
Run Code Online (Sandbox Code Playgroud)
我想 GROUP BY 并计算每个ASSET_TYPE与总成本相比的百分比:
+-----------------------+---------------+------------------+
| ASSET_TYPE | COST | PERCENT_OF_TOTAL |
+-----------------------+---------------+------------------+
| TRANSPORTATION | 2,000,000,000 | 75.4 |
| ACTIVE TRANSPORTATION | 150,000,000 | 5.6 |
| STORMWATER MANAGEMENT | 500,000,000 | …Run Code Online (Sandbox Code Playgroud) performance oracle aggregate computed-column query-performance
computed-column ×13
sql-server ×8
index ×3
postgresql ×3
t-sql ×3
aggregate ×1
functions ×1
interval ×1
mysql ×1
mysql-5 ×1
null ×1
oracle ×1
performance ×1
view ×1