计算位列,返回另一列是否为空。

16
我尝试创建这个计算列:
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个回答

22

这是有效的:

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

4
只有在被测试的列为数值型时才有效。如果SpecialItemId是nvarchar类型并且有值,则会导致错误。请参阅我的其他答案。 - Gary Barrett

19

Mark Byer的答案会在使用 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 
)

也适用于 varbinary - The Thirsty Ape

2

SQL Server 没有本地真正的布尔数据类型(以您可以在布尔表达式的位置使用变量的意义为准,例如select * from Item where IsSpecialItem)。您唯一能够表示它的方式就像 Mark 建议的那样,使用保留值(在这种情况下,您的查询将是 select * from Item where IsSpecialItem = 1)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接