我有一个资料表,其中有一个字段(FLAG)是标志该资料是否可用,为1则不可用,为或NULL时则可用(由于字段是新加的,所以有些是为空),我用下面语句查询时它为什么只显示所有为0的记录: select * from tablename where flag<>1但select * from tablename where flag=1 也只显示为1 的记录难道“=”与"<>" 不是互补的吗?

解决方案 »

  1.   

    null 记录一定要用  where flag is null 去取得吗?
    Database  :SQL 2000
      

  2.   

    既然有1,干吗不将null都改成0呢。
    好像是必须用  where flag is null 去取得,我记得我就用的union解决这个问题的。
      

  3.   

    为什么不设置默认值呢where flag=1 or flag is null
      

  4.   

    楼上的对了,但我建议在库中定义这个字段默认为0,就可以摆脱NULL的困扰。
      

  5.   

    一般设一个字段为标志位都是用数字来表示的,这里你可以设为0或者1,用varchar2(1)或者number都可以,用null太麻烦
      

  6.   

    select * from tablename where isnull(flag,0)<>1
      

  7.   

    NULL 参数任何比较操作,其结果都是NULL,而不是True, False你可以用ISNULL(,,)设定NULL的缺省值
      

  8.   

    楼主好象你的字段类型是int型吧,我刚才试了一下,果然如你所说,在这里<> 和 =是不互补,虽然一开始我也像楼主一样觉得很奇怪,细想一下,所谓互补也只是某些地方成立,而不是所有的地方,不然也就没有什么比如:三态门了,楼主你自己也说了要查到NULL值的记录的时候要用is NULL来判断,所以最好的解释是数据库里判断字段的三个条件 = ,<>, is NULL才成“互补”。至于如何避免楼上的各位已经说的够明白了。
      

  9.   

    应该老兄用的是sql server吧
    这应该是sql server的缺陷
      select * from tablename where isnull(flag,0)=0
    同时,告诉你另外一个怪现象
    select * from tablename where dd<'20030210'
    select * from tablename where dd<20030210
    你看那个对哟,呵呵
      

  10.   

    我只能说sql server 的语法太不严格了
    oracle绝对没有这种的怪现象哈
      

  11.   

    我用的是bit  型的字段,欢迎大家继续讨论,也可以是其它的一些"怪"现象.
      

  12.   

    =和<>只是在一定的范围内才互补
    离散数学没学好  :-)
      

  13.   

    where flag = 0 OR flag is null
      

  14.   

    null参加任何运算都是假,
    所以你无论怎么计算都找不到该纪录,
    只能用 where flag=0 or flag is null
    或使用默认值