SQLServer没有对表达式求值的功能,不可能对你存储的字符表达式,然后自动计算值。 所以你把等级表的条件看了以后,直接用SQL硬写就好了:SELECT 人名, 工资等级 = CASE WHEN 工龄 < 4 THEN '001' WHEN 工龄 >= 4 AND 工龄 < 5THEN '002' ...... END FROM 人员表
明明插入的代码样式,怎么变了,看来CSDN的标签弄得不好啊
--創建表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
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 行)
boblaw 说得非常好,谢谢,谢谢!
samfeng_2003 的结果有问题,方法对这个实例来说灵活性差,但不失为一种好方法
呵呵!只是提供一种思路,就是把B> =4 and B <5里面的数字分解成开始和结束两列,然后使用外联判断来求结果.对于,范围统计的话,建议楼主应该多出两列,一个开始一个结束这样更方便一些!
人名 工龄 薪金类别
a1 4 月薪
a2 5 日薪
a3 6 日薪工资等级表: 序号 条件 工资等级
d1 工龄 < 4 001
d2 工龄> =4 and 工龄 <5 002
d3 工龄> =5 and 工龄 <6 003
现统计每个人员的工资级别,请问SQL语句怎么写啊?谢谢
所以你把等级表的条件看了以后,直接用SQL硬写就好了:SELECT
人名,
工资等级 = CASE WHEN 工龄 < 4 THEN '001'
WHEN 工龄 >= 4 AND 工龄 < 5THEN '002'
......
END
FROM 人员表
--創建表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
(
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 行)
说得非常好,谢谢,谢谢!
如果你们公司有DIO,DBA,估计你这样设计,你就下课了.:)