给定一个输入数据表我希望有一个o “flag columns”集来描述同一记录的兄弟列。
比方说,我有一个类似下面的玩具表:
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_FLAG
和value_y_FLAG
中,以评估兄弟列value_x
和value_y
是否 {{1} }
我知道有NULL
或ISNULL()
这样的功能,但我不认为是这种情况,因为我正在尝试更新给定另一列的值的列< /强>
我知道我可以使用COALESCE()
语句但是将许多布尔标志(2 ^ n)的所有情况设置为在标志变量的相同“更新”语句中一起工作是非常复杂的。
如何处理?
设置好所有标志后,我想以某种方式总结我的表格。例如,我希望在所有标志变量上都有IF / ELSE
,然后我希望COUNT
给出“颜色类别”。
可能我不需要一组支持标志变量,但我想让它们使表更具可读性,而且SQL代码更具可读性。 谢谢!
答案 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的行数