读书人

求按条件查找的Sql语句解决办法

发布时间: 2012-04-10 21:03:56 作者: rapoo

求按条件查找的Sql语句

假设有这样一张表

代码, 姓名,年龄,政治面目,家庭人口数
001 张三 34 群众 5
002 李四 48 党员 4
004 王五 61 党员 6
005 陈酒 21 团员 4
006 李二 27 党员 2

我现在有几个审核公式(可动态添加的),要求找出并标注审核结果;
一、年龄在30及以上;
二、政治面目是党员
三、家庭人口数大于4
如果用程序只能每条的按这种条件检测,但是数据量特别大,速度慢,
如果用SQL怎么做:

根据上表生成审核结果应如下:
代码, 姓名, 结果
001 张三 年龄在30及以上,家庭人口数大于4
002 李四 年龄在30及以上,政治面目是党员
004 王五 年龄在30及以上,政治面目是党员,家庭人口数大于4
006 李二 政治面目是党员

[解决办法]
--建立测试环境
create table #tb(代码 varchar(5),姓名 varchar(5),年龄 int,政治面目 varchar(5),家庭人口数 int)
insert #tb(代码,姓名,年龄,政治面目,家庭人口数)
select '001 ', '张三 ', '34 ', '群众 ', '5 ' union all
select '002 ', '李四 ', '48 ', '党员 ', '4 ' union all
select '004 ', '王五 ', '61 ', '党员 ', '6 ' union all
select '005 ', '陈酒 ', '21 ', '团员 ', '4 ' union all
select '006 ', '李二 ', '27 ', '党员 ', '2 '
go
--执行测试语句
select t.代码,t.姓名,t.年龄,t.政治面目,t.家庭人口数
,case when 年龄 > = 30 then '年龄在30及以上, ' else ' ' end
+case when 家庭人口数 > 4 then '家庭人口数大于4, ' else ' ' end
+case when 政治面目 = '党员 ' then '政治面目是党员, ' else ' ' end as 审核结果
from #tb t
go
--删除测试环境
drop table #tb
go
/*--测试结果
代码 姓名 年龄 政治面目 家庭人口数 审核结果
----- ----- ----------- ----- ----------- ----------------------------------------------
001 张三 34 群众 5 年龄在30及以上,家庭人口数大于4,
002 李四 48 党员 4 年龄在30及以上,政治面目是党员,
004 王五 61 党员 6 年龄在30及以上,家庭人口数大于4,政治面目是党员,
005 陈酒 21 团员 4
006 李二 27 党员 2 政治面目是党员,

(5 row(s) affected)

*/


[解决办法]
create table t1(代码 varchar(8),姓名 varchar(8),年龄 int,政治面目 varchar(8),家庭人口数 int)
insert into t1 select '001 ', '张三 ',34, '群众 ',5
insert into t1 select '002 ', '李四 ',48, '党员 ',4
insert into t1 select '004 ', '王五 ',61, '党员 ',6
insert into t1 select '005 ', '陈酒 ',21, '团员 ',4
insert into t1 select '006 ', '李二 ',27, '党员 ',2
go

--col描述用于与t1匹配的字段名,type描述col对应字段类型,0为字符类型/1为数字类型
--operate描述与条件匹配的类型,0: "= "/1: "> "/2: " < ",根据需求还可以增加
create table t2(code int,col varchar(10),type int,operate int,value varchar(20),[desc] varchar(40))
insert into t2 select 1, '年龄 ' ,1,1, '30 ', '年龄在30及以上 '


insert into t2 select 1, '政治面目 ' ,0,0, '党员 ', '政治面目是党员 '
insert into t2 select 1, '家庭人口数 ',1,1, '4 ', '家庭人口数大于4 '
go

declare @sql varchar(8000)
set @sql= ' '

select @sql=@sql+ '+max(case when '+col+(case type when 0 then '= ' when 1 then '> ' when 2 then ' < ' end)+(case type when 0 then ' ' ' '+value+ ' ' ' ' else value end) + ' then ' ', '+[desc]+ ' ' ' else ' ' ' ' end) '
from t2

set @sql= 'select 代码,stuff([desc],1,1, ' ' ' ') as [desc] from (select 代码, '+stuff(@sql,1,1, ' ')+ ' as [desc] from t1 group by t1.代码) t where [desc] <> ' ' ' ' '

exec(@sql)
/*
代码 desc
-------- ---------------------------------------------
001 年龄在30及以上,家庭人口数大于4
002 年龄在30及以上,政治面目是党员
004 年龄在30及以上,政治面目是党员,家庭人口数大于4
006 政治面目是党员
*/
go

drop table t1,t2
go
/*
根据上表生成审核结果应如下:
代码, 姓名, 结果
001 张三 年龄在30及以上,家庭人口数大于4
002 李四 年龄在30及以上,政治面目是党员
004 王五 年龄在30及以上,政治面目是党员,家庭人口数大于4
006 李二 政治面目是党员
*/

读书人网 >SQL Server

热点推荐