#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)
)