如何 select 2 个布尔列并检索 1 个布尔结果(两者都必须为 true = true)
How to select 2 boolean columns and retrieve 1 boolean result (both must be true = true)
在 SQL 服务器中我有多个 bit
列。如果产品 = False 或类别 = False,我想 return False。
我的测试代码:
declare @b0 bit
declare @b1 bit
set @b0 = 0
set @b1 = 1
select (@b0 and @b1)
select (@b0 + @b1)
select (@b0 = @b1)
但是3个都选择崩溃了。
我的实际代码片段:
select
c.bCatActive, -- I want to dispose of this line.
p.bProdActive, -- I want to dispose of this line.
(c.bCatActive and p.bProdActive) as IsActive -- I want to retrieve this line but doesn't work.
from
Category c, Product p
where
p.ProductID = 999
and c.CategoryID = p.CategoryID
当然我可以用两个 If-Then 来做到这一点,但我当前的查询是一个令人愉快的干净查询,所以我希望在一行中完成。
显式比较怎么样?
(case when c.bCatActive = 1 and p.bProdActive = 1 then 1 else 0 end) as IsActive
bits
不是 布尔值.
您还应该学习正确、明确、标准、可读的JOIN
语法。
如果只有 0 和 1,那么试试这个:
select (c.bCatActive * p.bProdActive) as IsActive
from Category c
, Product p
where p.ProductID = 999
and c.CategoryID = p.CategoryID
如果 c.bCatActive 和 p.bProdActive 的值为 1,它只会产生 1 作为 IsActive。如果其中任何一个为 0,它将 return 0。这是唯一的选择我现在可以想到,因为您不想使用 if 或 case。
你很接近,布尔值应该使用布尔逻辑:
declare @b0 bit
declare @b1 bit
set @b0 = 0
set @b1 = 0
select (@b0 & @b1)
对and使用&,对or
使用|
在 SQL 服务器中我有多个 bit
列。如果产品 = False 或类别 = False,我想 return False。
我的测试代码:
declare @b0 bit
declare @b1 bit
set @b0 = 0
set @b1 = 1
select (@b0 and @b1)
select (@b0 + @b1)
select (@b0 = @b1)
但是3个都选择崩溃了。
我的实际代码片段:
select
c.bCatActive, -- I want to dispose of this line.
p.bProdActive, -- I want to dispose of this line.
(c.bCatActive and p.bProdActive) as IsActive -- I want to retrieve this line but doesn't work.
from
Category c, Product p
where
p.ProductID = 999
and c.CategoryID = p.CategoryID
当然我可以用两个 If-Then 来做到这一点,但我当前的查询是一个令人愉快的干净查询,所以我希望在一行中完成。
显式比较怎么样?
(case when c.bCatActive = 1 and p.bProdActive = 1 then 1 else 0 end) as IsActive
bits
不是 布尔值.
您还应该学习正确、明确、标准、可读的JOIN
语法。
如果只有 0 和 1,那么试试这个:
select (c.bCatActive * p.bProdActive) as IsActive
from Category c
, Product p
where p.ProductID = 999
and c.CategoryID = p.CategoryID
如果 c.bCatActive 和 p.bProdActive 的值为 1,它只会产生 1 作为 IsActive。如果其中任何一个为 0,它将 return 0。这是唯一的选择我现在可以想到,因为您不想使用 if 或 case。
你很接近,布尔值应该使用布尔逻辑:
declare @b0 bit
declare @b1 bit
set @b0 = 0
set @b1 = 0
select (@b0 & @b1)
对and使用&,对or
使用|