Вычисляем битовый столбец, который возвращает, является ли другой столбец нулевым - PullRequest
9 голосов
/ 06 декабря 2009

Я пытаюсь получить этот вычисляемый столбец:

CREATE TABLE dbo.Item
(
    ItemId int NOT NULL IDENTITY (1, 1),
    SpecialItemId int NULL,
    --I tried this
    IsSpecialItem AS ISNULL(SpecialItemId, 0) > 0, 
    --I tried this
    IsSpecialItem AS SpecialItemId IS NOT NULL
    --Both don't work
)  ON [PRIMARY]

Ответы [ 3 ]

16 голосов
/ 06 декабря 2009

Это работает:

CREATE TABLE dbo.Item
(
    ItemId int NOT NULL IDENTITY (1, 1),
    SpecialItemId int NULL,
    IsSpecialItem AS
        CAST(CASE ISNULL(SpecialItemId, 0) WHEN 0 THEN 0 ELSE 1 END AS bit)
)
14 голосов
/ 27 июня 2012

Ответ Марк Байера вызывает ошибку со столбцами nvarchar, независимо от того, является ли столбец int или nvarchar:

, работает следующее:
CREATE TABLE dbo.Item
(
    ItemId int NOT NULL IDENTITY (1, 1),
    SpecialItemId [nvarchar](50) NULL,
    CAST(CASE WHEN SpecialItemId Is NULL THEN 0 ELSE 1 END AS bit)
      AS IsSpecialItem 
)
2 голосов
/ 06 декабря 2009

SQL Server не имеет никакого собственного истинного логического типа данных (в том смысле, что вы можете использовать переменную вместо логического выражения, например select * from Item where IsSpecialItem). Единственный способ представить это с помощью чего-то, как предлагает Марк, используя зарезервированные значения (в этом случае ваш запрос будет select * from Item where IsSpecialItem = 1).

...