Создание вычисляемого поля для моей простой таблицы SQL 2008

#sql #sql-server-2008

#sql #sql-server-2008

Вопрос:

Вот как выглядит таблица:

 create table Shipping
(
ShippingId int primary key identity(1,1),
ProductId int foreign key references Product(ProductId),
LargoEnCm decimal(16,2),
AltoEnCm decimal(16,2),
AnchoEnCm decimal(16,2),
PesoKg decimal(16,2),
PesoVolumen decimal(16,2),
PesoFacturable decimal(16,2),
A decimal(16,2),
B decimal(16,2),
C decimal(16,2),
D decimal(16,2),
E decimal(16,2),
F decimal(16,2),
G decimal(16,2)
)
 

Например, поле PesoVolumen должно быть вычисляемым полем из этого:

 (LargoEnCm * AltoEnCm * AnchoEnCm) / 6000
 

Как мне объявить это вычисление, чтобы каждый раз, когда кто-то вводит данные в строки, это поле заполнялось автоматически?

Как насчет условных операторов? Поддерживает ли SQL это?

Например, в PesoFacturable значение либо PesoKg или PesoVolumen войдет в него, в зависимости от того, что больше. Оператор If решит эту проблему, могу ли я написать это непосредственно в SQL?

Ответ №1:

Посмотрите документацию для вычисляемых столбцов. Вам нужно что-то вроде этого:

 create table Shipping
(
ShippingId int primary key identity(1,1),
ProductId int foreign key references Product(ProductId),
LargoEnCm decimal(16,2),
AltoEnCm decimal(16,2),
AnchoEnCm decimal(16,2),
PesoKg decimal(16,2),
PesoFacturable decimal(16,2),
A decimal(16,2),
B decimal(16,2),
C decimal(16,2),
D decimal(16,2),
E decimal(16,2),
F decimal(16,2),
G decimal(16,2),
PesoVolumen AS (LargoEnCm * AltoEnCm * AnchoEnCm) / 6000
)
 

Вы можете включить большинство выражений в качестве вычисляемого вычисления столбца, включая операторы CASE.

Ответ №2:

 CREATE TABLE [dbo].[Shipping]
(
    [ShippingId]        INT PRIMARY KEY IDENTITY(1,1),
    [ProductId]         INT FOREIGN KEY REFERENCES [dbo].[Product]([ProductId]),
    [LargoEnCm]         DECIMAL(16,2),
    [AltoEnCm]          DECIMAL(16,2),
    [AnchoEnCm]         DECIMAL(16,2),
    [PesoKg]            DECIMAL(16,2),
    [PesoFacturable]    AS CASE WHEN [PesoKg] > (([LargoEnCm] * [AltoEnCm] * [AnchoEnCm]) / 6000) THEN [PesoKg] ELSE (([LargoEnCm] * [AltoEnCm] * [AnchoEnCm]) / 6000) END,
    [A]                 DECIMAL(16,2),
    [B]                 DECIMAL(16,2),
    [C]                 DECIMAL(16,2),
    [D]                 DECIMAL(16,2),
    [E]                 DECIMAL(16,2),
    [F]                 DECIMAL(16,2),
    [G]                 DECIMAL(16,2),
    [PesoVolumen]       AS (([LargoEnCm] * [AltoEnCm] * [AnchoEnCm]) / 6000)
)