我有一张表格400多列,100多行,表格是从数据库导出,单元格的数据一般只会出现 2.29或者0.69或者2.27 只有个别单元格因为原始设备不稳定导致不等于这三个数 比如 2.5 我现在就是想查出有哪些单元格的数值是不等于 2.29 0.69和2.27的,也就是说是不稳定的,请问该用什么语句快速?

解决方案 »

  1.   

    select * from table where col1<>2.29 and col2 <>0.69 and col3<>2.27
      

  2.   

    400多列。 excel里面可以使用VBA进行判断,然后改变背景颜色。参考http://www.cnblogs.com/Denveryang/archive/2010/03/05/Excel.html
      

  3.   

    本帖最后由 roy_88 于 2011-07-06 13:44:01 编辑
      

  4.   


    大哥,小弟初学,你这个东西我不会改, 我数据库的名字是jas 表名是buguding 往哪里改呢
      

  5.   


    请问最后一句1=2是什么意思,肯定是敲错了
    改成1=1,其作用也就是加个where 条件与动态sql中的or相连。
      

  6.   


    declare @s varchar(255)
    select @s=' or '+quotename(a.name) + 'not in(2.29,0.65,2.27)'
    from syscolumns as a
        inner join SysTypes as b on a.Xtype=b.Xtype
    where a.ID=object_id('buguding')           
    and b.Name in('varchar')        exec('select * from buguding where 1=1'+@s)我现在的代码是这样的
      

  7.   

    代码没有试验过,你先执行看看,如果不行再给你改。--假设你的表(400列*100行)名为:tb1
    --按你描述,我理解的,你的表中没有一个用来记录行的字段,所以新建了一个表,加入了行号。
    select identity(int,1,1) as 行号,* into tb_temp from tb1;
    --使用语句将你的400列都自动添加到语句中去
    declare @sql nvarchar(2000);
    select @sql=@sql+name+' not in(2.29,0.69,2.27) or ' from syscolumns where id=object_id('tb1');
    set @sql='select * from tb1 where '+left(@sql,len(@sql)-3);
    --执行语句
    exec(@sql);
      

  8.   

    --这样试试
    declare @s varchar(255)
    select @s=' or '+quotename(a.name) + 'not in(''2.29'',''0.65'',''2.27'')'
    from syscolumns as a
        inner join SysTypes as b on a.Xtype=b.Xtype
    where a.ID=object_id('buguding')           
    and b.Name in('varchar')        exec('select * from buguding where 1=1'+@s)
      

  9.   

    --再试试
    declare @s varchar(255)
    select @s=isnull(@s,'')+' or '+quotename(a.name) + 'not in(2.29,0.65,2.27)'
    from syscolumns as a
        inner join SysTypes as b on a.Xtype=b.Xtype
    where a.ID=object_id('buguding')           
    and b.Name in('varchar')        exec('select * from buguding where 1=1'+@s)
      

  10.   


    这样显示的:
    服务器: 消息 105,级别 15,状态 1,行 1
    字符串 'STR1_O' 之前有未闭合的引号。
    服务器: 消息 170,级别 15,状态 1,行 1
    第 1 行: 'STR1_O' 附近有语法错误。
      

  11.   


    use jas
    godeclare @s nvarchar(4000)
    select @s=' or '+quotename(a.Name) +' not in(2.29,0.69,2.27)' 
    from syscolumns as a
        inner join SysTypes as b on a.Xtype=b.Xtype
    where a.ID=object_id('buguding')            --表名
    and b.Name in('decimal','numeric')        --定義類型exec('select * from buguding where 1=2'+@s)這樣改,要知道字段的類型,這里判斷是'decimal','numeric'1=2--是用於 or 條件拼湊動態 
    1=1--是用於 and 條件
      

  12.   

    现在经过 roy_88 的方法修改后  就一条数据都没有,但是输入一个任意数值,会把正行都是null值的记录过滤掉,之前的方法显示整表是连null值都有
      

  13.   

    處理把null替換為0再判斷,用isnull
    use jas
    godeclare @s nvarchar(4000)
    select @s=' or isnull('+quotename(a.Name) +',0) not in(2.29,0.69,2.27)' 
    from syscolumns as a
        inner join SysTypes as b on a.Xtype=b.Xtype
    where a.ID=object_id('buguding')            --表名
    and b.Name in('decimal','numeric')        --定義類型exec('select * from buguding where 1=2'+@s)
      

  14.   

    OK,今天做了5列的表试验过了,改了两个位置。
    以下是可以查询了语句,你再执行一遍。select identity(int,1,1) as 行号,* into tb_temp from tb1;
    --使用语句将你的400列都自动添加到语句中去
    declare @sql nvarchar(4000);set @sql='';
    select @sql=@sql+name+' not in(2.29,0.69,2.27) or ' from syscolumns where id=object_id('tb1');
    set @sql='select * from tb_temp where '+left(@sql,len(@sql)-3);
    --执行语句
    exec(@sql);
      

  15.   


    这么报错
    服务器: 消息 170,级别 15,状态 1,行 1
    第 1 行: 'STR1_OH' 附近有语法错误。
      

  16.   

    晕,我把我建的表也贴出来,你自己去对照以下,看和你的表结构有哪些区别。我运行是正常的。
    create table tb1
    (
    col1 float,
    col2 float,
    col3 float,
    col4 float,
    col5 float,
    )
    insert tb1
    select 2.29,0.69,2.27,2.29,0.69
    union
    select 1.29,0.69,2.27,2.29,0.69
    union
    select 2.29,0.69,2.27,2.29,0.69
    union
    select 2.29,0.69,2.27,2.29,0.69
    union
    select 2.09,0.69,2.27,2.29,0.69
    union
    select 2.29,0.69,2.27,2.29,0.1
    union
    select 2.29,0.69,2.27,2.29,0.69
    union
    select 2.29,0.69,2.57,2.29,0.69
    union
    select 2.29,0.69,2.27,2.29,0.69select identity(int,1,1) as 行号,* into tb_temp from tb1;
    --使用语句将你的400列都自动添加到语句中去
    declare @sql nvarchar(4000);set @sql='';
    select @sql=@sql+name+' not in(2.29,0.69,2.27) or ' from syscolumns where id=object_id('tb1');
    set @sql='select * from tb_temp where '+left(@sql,len(@sql)-3);
    --执行语句
    exec(@sql);
      

  17.   

    哦,知道了,可能是你的列数太多了,结果在@SQl中存放的字符超出了定义的4000个。
      

  18.   

    扩展了一下,运行下面这个:
    select identity(int,1,1) as 行号,* into tb_temp from tb1;
    --使用语句将你的400列都自动添加到语句中去
    declare @sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000),@sql4 nvarchar(4000);
    select @sql1='',@sql2='',@sql3='',@sql4='';
    select top 100 @sql1=@sql1+name+' not in(2.29,0.69,2.27) or ' from syscolumns where id=object_id('tb1') order by name;select top 100 @sql2=@sql2+name+' not in(2.29,0.69,2.27) or ' from syscolumns where id=object_id('tb1') 
    and name not in(select top 100 name from syscolumns where id=object_id('tb1') order by name) order by name;select top 100 @sql3=@sql3+name+' not in(2.29,0.69,2.27) or ' from syscolumns where id=object_id('tb1') 
    and name not in(select top 200 name from syscolumns where id=object_id('tb1') order by name) order by name;select top 100 @sql4=@sql4+name+' not in(2.29,0.69,2.27) or ' from syscolumns where id=object_id('tb1') 
    and name not in(select top 300 name from syscolumns where id=object_id('tb1') order by name) order by name;set @sql4=left(@sql4,case when len(@sql4)-3<0 then 0 else len(@sql4)-3 end)
    if @sql4='' set @sql3=left(@sql3,case when len(@sql3)-3<0 then 0 else len(@sql3)-3 end)
    if @sql3='' set @sql2=left(@sql2,case when len(@sql2)-3<0 then 0 else len(@sql2)-3 end)
    if @sql2='' set @sql1=left(@sql1,case when len(@sql1)-3<0 then 0 else len(@sql1)-3 end)exec('select * from tb_temp where '+@sql1+@sql2+@sql3+@sql4);