Более удобный способ написать CHECK CONSTRAINT, который проверяет, что ровно одно значение не равно нулю

Представьте, что у меня есть таблица с целыми столбцами Col1, Col2, Col3, Col4. столбец допускает значение NULL, а допустимая строка должна содержать значение ровно в 1 столбце (т. е. все значения NULL недопустимы и более 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;

Оно работает, но мне кажется, что есть более элегантный способ добиться того же результата (например, этот вопросник хочет проверить, что хотя бы одно поле не является нулевым, а ключевое слово COALESCE работает хорошо в этом случае).

5
задан Community 23 May 2017 в 10:29
поделиться