我的问题可能是如此愚蠢,以至于我遗漏了一些非常明显的东西。我有一个带有数字字段的表,表示布尔值,1或0.我的表是这样创建的:
create table mytable ("summarized" NUMBER DEFAULT 0)
..我想查询数字字段'summa'等于0的记录。现在看看下面的查询,实际输出放在查询后面:
select count(*) from mytable where summarized = 0; -- 0
select count(*) from mytable where summarized = 1; -- 0
select count(*) from mytable where summarized != 0; -- 88223
select count(*) from mytable where summarized != 1; -- 1594
select count(*) from mytable where to_char(summarized) = '0'; -- 1594
select summarized, count(*) from mytable group by summarized; -- 1 = 88223, 0 = 1594
我的第一直觉就是像第一个一样创建我的查询。我似乎无法理解为什么它不起作用以及为什么我必须使用to_char函数,如果我想在where子句中使用'equals 0'。
编辑: 在我尝试答案的时候,我注意到我无法重现问题,即使是带引号的列名。在制作了我的表副本并删除旧表后,我的查询和我的应用程序再次按预期工作。我不确定是什么导致了这种异常,但它现在已经消失了。
我很抱歉占用你的时间,但是感谢大家在答案中的有用评论! (我希望我可以给你一个upvote,但我的代表太低了)
答案 0 :(得分:2)
一个良好的开端是对该列设置检查约束:
alter table mytable add constraint chk_mytable_summarized check (summarized in (0,1))
...还有一个非空约束......
alter table mytable modify (summarized not null)
(不要在对象名称周围使用双引号,如Nagaraj所说)
答案 1 :(得分:1)
表创建语法
create table mytable (summarized NUMBER DEFAULT 0)
select count(*) from mytable where summarized != 0;