表二有三个字段abc,表二的b字段里存储的与表一B字段连接的条件
?没看懂是咋连接的?

解决方案 »

  1.   

    形象一点:人员表: 
    人名       工龄     薪金类别 
    a1         4       月薪
    a2         5       日薪 
    a3         6       日薪工资等级表: 序号               条件                       工资等级  
    d1           工龄 < 4                          001 
    d2           工龄> =4   and   工龄 <5           002 
    d3           工龄> =5   and   工龄 <6           003 
    现统计每个人员的工资级别,请问SQL语句怎么写啊?谢谢
      

  2.   

    SQLServer没有对表达式求值的功能,不可能对你存储的字符表达式,然后自动计算值。
    所以你把等级表的条件看了以后,直接用SQL硬写就好了:SELECT
      人名,
      工资等级 = CASE WHEN 工龄 < 4 THEN '001'
                     WHEN 工龄 >= 4 AND 工龄 < 5THEN '002'
                     ......
                END
    FROM 人员表
      

  3.   

    明明插入的代码样式,怎么变了,看来CSDN的标签弄得不好啊
      

  4.   


    --創建表1
    create table  table1
    (A varchar(10),B int ,C varchar(10))
    go
    --創建表2
    create table  table2 
    (a varchar(10),b varchar(50) ,c varchar(10))
    go
    --插入測試數據
    insert into table1 values('a1',4,'01')
    insert into table1 values('a2',5,'02')
    insert into table1 values('a3',6,'03')
    insert into table2 values('d1','B<4','001')
    insert into table2 values('d2','B>=4 and B<5','002')
    insert into table2 values('d3','B>=5 and B<6','003')--查詢
    declare @sql varchar(2000)
    set @sql=''
    select @sql=@sql+' select A,B,'''+ c+''' as c from table1 where ('+b+') union'  from table2 
    if @sql<>''  set @sql=left(@sql,len(@sql)-5)
    execute( @sql)
    --------------------------------------------------
    --測試結果
    a1 4 002
    a2 5 003
    --刪除測試表
    drop table table1
    drop table table2
      

  5.   

    declare @t1 table
    (
    a varchar(20),
    b varchar(20),
    c varchar(20)
    )
    declare @t2 table
    (   
    A varchar(20),
    B int,
    C varchar(20)
    )insert into @t2
    select 'a1',4,'01' union all
    select 'a2',5,'02' union all
    select 'a3',6,'03' insert into @t1
    select 'd1','B <     4','001' union all 
    select 'd2','B> =4   and   B <5','002'  union all
    select 'd3','B> =5   and   B <6','003'
    SELECT * FROM @t2 A
    WHERE
     EXISTS
      (
      SELECT * FROM (
       SELECT *,
           d = CAST(
           CASE WHEN PATINDEX('%[^0-9]%',STUFF(b,1,PATINDEX('%[0-9]%',b)-1,'')) = 0
           THEN NULL
           ELSE SUBSTRING(STUFF(b,1,PATINDEX('%[0-9]%',b)-1,''),1,PATINDEX('%[^0-9]%',STUFF(b,1,PATINDEX('%[0-9]%',b)-1,'')))
           END AS INT),
           e = 
           CASE WHEN PATINDEX('%[^0-9]%',STUFF(b,1,PATINDEX('%[0-9]%',b)-1,'')) = 0
           THEN STUFF(b,1,PATINDEX('%[0-9]%',b)-1,'')
           ELSE RIGHT(b, PATINDEX('%[^0-9]%',REVERSE(b))-1)
           END
        FROM @t1 
       ) B WHERE ( A.b < B.e ) AND ( A.b >= b.d OR b.d IS NULL))A                    B           C                    
    -------------------- ----------- -------------------- 
    a1                   4           01
    a2                   5           02(所影响的行数为 2 行)
      

  6.   

    boblaw 
    说得非常好,谢谢,谢谢!
      

  7.   

    samfeng_2003 的结果有问题,方法对这个实例来说灵活性差,但不失为一种好方法
      

  8.   

    呵呵!只是提供一种思路,就是把B> =4   and   B <5里面的数字分解成开始和结束两列,然后使用外联判断来求结果.对于,范围统计的话,建议楼主应该多出两列,一个开始一个结束这样更方便一些!
      

  9.   

    实现就好,站的角度不同,是想的不同.
    如果你们公司有DIO,DBA,估计你这样设计,你就下课了.:)