将布尔逻辑语句的结果分配给 T-sql 中的位字段

Assign result of Boolean Logic statements to bit field in T-sql

提问人:Josh 提问时间:5/4/2011 最后编辑:CommunityJosh 更新时间:5/4/2011 访问量:2690

问:

根据这个问题,我不能将布尔逻辑语句的结果赋值到位字段中。我的问题是我正在处理一个创建脚本,并且我有一些依赖标志需要布尔语句才能完成。此脚本将以所有 null 开头,用户只需输入他们想要的数据。该脚本将检测记录是否已存在。如果是这样,它将仅更新非 null 的参数。如果不存在,脚本将创建一个新记录。我正在使用 sql server 2005。

我弄清楚了插入语句,用于在未分配变量时设置默认值。我的问题来自一个特定的设置,它依赖于 2 个设置标志。如果我需要添加一个设置标志,我还希望看到一个可以支持另一个设置标志的解决方案。ISNULL(@Setting1, 0)

DECLARE @Setting1 bit
DECLARE @Setting2 bit
DECLARE @Setting3 bit

--... code snipped for setting the value

UPDATE
    MyTable
SET
    EnableSetting1 = ISNULL(@Setting1, EnableSetting1),
    EnableSetting1 = ISNULL(@Setting2, EnableSetting2),
    EnableSetting1 = ISNULL(@Setting3, EnableSetting3),
    EnableComplexSetting1 = ISNULL(@Setting1, EnableComplexSetting1),
    EnableComplexSetting2 = ?
WHERE
    Id = @MyId

从逻辑上讲,看起来像,但这显然是不正确的。我应该如何设置复杂设置 2?如果从逻辑上讲是这样,我会怎么做,等等??ISNULL(@Setting2, EnableSetting2) OR ISNULL(@Setting3, EnableSetting3)ISNULL(@Setting2, EnableSetting2) OR ISNULL(@Setting3, EnableSetting3) OR ISNULL(@Setting4, EnableSetting4)

sql-server-2005 t-sql 布尔逻辑

评论


答:

4赞 marc_s 5/4/2011 #1

ISNULL不返回布尔值 - 如果第一个表达式为 NULL,它只是确保使用提供的第二个值。

您需要使用如下内容:

UPDATE
    MyTable
SET
    EnableSetting1 = CASE WHEN @Setting1 IS NULL THEN 1 ELSE 0 END,
...

根据您要存储的布尔值(如果真的为 NULL),您可能需要在 和 情况下切换两个值。@Setting1THENELSE

使用此方法,您应该还能够检查两个条件:

UPDATE MyTable
SET EnableComplexSetting2 = 
        CASE WHEN (Complex1 IS NULL AND Complex2 IS NULL) THEN 1 ELSE 0 END 

 ......

评论

0赞 Josh 5/4/2011
我正在按照我的意图使用上面的 ISNULL,并且它有效。我的问题是在设置 EnableComplexSetting2 时,如果有任何(@Setting1或@Setting)为 1,则结果为 1。此外,如果这些设置中的任何一个为 null,我想使用表中的值。
1赞 Josh 5/4/2011
我最终做了类似的事情。在更新之前,我正在从表中进行选择,并将 和 using 的值以及表中的当前值设置为默认值。然后在我的更新中,我使用一个 case 语句,其中如果任一是 1,则设置为 1,否则将其设置为 0。感谢您的帮助。@Setting1@Setting2ISNULLEnableComplexSetting2
0赞 marc_s 5/4/2011
@Josh:很高兴我能帮上忙,最后;-)对不起,我的第一条评论——仅仅从帖子中,通常很难知道一个给定的发帖人对他所问的事情真正了解多少