我有一个看起来与此类似的视图:
CREATE VIEW Shipment.Shipment AS
SELECT CASE
WHEN shipmentOld.SHIPMENT_ID = 0 OR shipmentOld.SHIPMENT_ID = -1 THEN NULL
ELSE shipmentOld.SHIPMENT_ID
END AS ShipmentId,
OtherValue, SomeOtherValue, OtherStuff
FROM dbo.tblShipment_Old shipmentOld
GO
然后如果我做这样的查询:
SELECT * FROM Shipment.Shipment WHERE ShipmentId = 18140
我得到了完整的索引扫描。原因是它在表中的所有行上运行 ShipmentId 的 case 表达式,并将结果与我的 ShipmentId (18140) 进行比较。非 sargable 的定义。
我正在使用这个视图来规范化遗留数据,这样我就可以在它之上编写一个新的应用程序。 我只希望 case 表达式在输出时运行。
我猜这是不可能的,但我想在我追求更极端的选择之前我会问。所以这是我的问题:
是否仍然可以让我的 ShipmentId 输出通过 case 表达式,但在where子句中使用 ShipmentId 时也可以进行可搜索查询?
不,SQL Server 不会为您做这些。
这是您可以使用内联表值函数的地方,有时称为“参数化视图”。例如
或者在您的视图中添加一个额外的列。
如果这只是一个性能问题,那么您可以考虑这样写您的观点:
这允许在过滤非 0 或 -1 的值时进行索引查找:
如果您真正想要的是在视图中有一个列在
WHERE
子句中使用时和在子句中使用时表现不同SELECT
,那么不,那是不可能的。