想象一下,我有一个包含整数列 Col1、Col2、Col3、Col4 的表。每列都可以为空,并且有效行必须包含恰好 1 列中的值(即所有空值都无效,多于 1 列也是无效的)。
目前我有这样的检查约束
ALTER TABLE [dbo].[MyTable] WITH CHECK
ADD CONSTRAINT [CK_ReportTemplateAttributes] CHECK
((
[Col1] IS NOT NULL AND [Col2] IS NULL AND [Col3] IS NULL AND [Col4] IS NULL
OR
[Col1] IS NULL AND [Col2] IS NOT NULL AND [Col3] IS NULL AND [Col4] IS NULL
OR
[Col1] IS NULL AND [Col2] IS NULL AND [Col3] IS NOT NULL AND [Col4] IS NULL
OR
[Col1] IS NULL AND [Col2] IS NULL AND [Col3] IS NULL AND [Col4] IS NOT NULL
));
GO;
它有效,但令我震惊的是,可能有一种更优雅的方式来实现相同的结果(例如,这个提问者想要检查至少 1 个字段不为空,并且COALESCE
关键字在这种情况下运行良好)。