给定同一记录中其他列(NULL值)的值,更新许多标志列

时间:2012-06-07 12:54:03

标签: sql-server-2005 flags dbnull data-integration

给定一个输入数据表我希望有一个o “flag columns”集来描述同一记录的兄弟列

  • 我使用的是Microsoft SQL Server 2005
  • 首先,我需要在目标表中加载数据,然后我需要执行检查以将值放在这些标志列中。

比方说,我有一个类似下面的玩具表:

CREATE TABLE zzz_test
             (
                          color        VARCHAR(10),
                          value_x      INTEGER    ,
                          value_y      INTEGER    ,
                          value_x_FLAG bit        ,
                          value_y_FLAG bit
             )

然后我有以下玩具数据(我需要为每条记录重复INSERT / VALUES语句,因为“旧的”2005 SQL版本):

INSERT zzz_test(color,value_x,value_y)
VALUES('red',1,NULL)
INSERT zzz_test(color,value_x,value_y)
VALUES('green',NULL,NULL)
INSERT zzz_test(color,value_x,value_y)
VALUES('red',NULL,2)
INSERT zzz_test(color,value_x,value_y)
VALUES('red',1,3)
INSERT zzz_test(color,value_x,value_y)
VALUES('black',NULL,1)
INSERT zzz_test(color,value_x,value_y)
VALUES(NULL,3,2)
INSERT zzz_test(color,value_x,value_y)
VALUES('black',1,2)
INSERT zzz_test(color,value_x,value_y)
VALUES('red',3,4)
INSERT zzz_test(color,value_x,value_y)
VALUES('green',1,1)
INSERT zzz_test(color,value_x,value_y)
VALUES('blue',5,NULL)

现在,我希望快速将值放在value_x_FLAGvalue_y_FLAG中,以评估兄弟列value_xvalue_y是否 {{1} }

我知道有NULLISNULL()这样的功能,但我不认为是这种情况,因为我正在尝试更新给定另一列的值的列< /强>

我知道我可以使用COALESCE()语句但是将许多布尔标志(2 ^ n)的所有情况设置为在标志变量的相同“更新”语句中一起工作是非常复杂的。

如何处理?

设置好所有标志后,我想以某种方式总结我的表格。例如,我希望在所有标志变量上都有IF / ELSE,然后我希望COUNT给出“颜色类别”。

可能我不需要一组支持标志变量,但我想让它们使表更具可读性,而且SQL代码更具可读性。 谢谢!

1 个答案:

答案 0 :(得分:2)

在所有插入之后尝试这样做

update zzz_test set value_x_FLAG = CASE value_x when null then 1 else 0 END, value_y_FLAG = CASE value_y when null then 1 else 0 END

希望它有效!

编辑:关于计数,你可以在每次需要时使用group by子句,而不是在某个地方保存一个标志

select Color, Count(value_x_FLAG) from zzz_test  group by Color having value_x_FLAG != 0

这将返回一个2列表,带有颜色,而另一列则返回具有flag = 1的行数