日期:2014-05-18  浏览次数:20691 次

如何在数据表中的多个字段中找到特定的字符的问题
现在有这样的表t1
表结构是这样的:
id a1 a2 a3 a4 ....
1 A B C D
2 B C D E
3 C A G CD
4 A B S AB
5 C D E C
6 B A F C
7 G B A C
...
其中表的T1是动态创建的,字段数量是未知的,意思就是T1表字段可能到A4,下一次T1表的字段可能就到A20了

现在想从这个表中查出最大字母来怎么做。比如上表的最大的字母是“S”。
这个SQL如何写啊。






------解决方案--------------------
如果只是这个表和查询字母S的话
select * from t1 where "s" in(A1,A2,A3,A4)
------解决方案--------------------
--假设你的每个字段,其字母是从A到Z排列,使用系统表和动态sql完成.
SQL code
create table tb(id int,a1 varchar(10),a2 varchar(10),a3 varchar(10),a4 varchar(10)) 
insert into tb values(1 ,'A', 'B', 'C', 'D')
insert into tb values(2 ,'B', 'C', 'D', 'E')
insert into tb values(3 ,'C', 'A', 'G', 'CD')
insert into tb values(4 ,'A', 'B', 'S', 'AB')
insert into tb values(5 ,'C', 'D', 'E', 'C')
insert into tb values(6 ,'B', 'A', 'F', 'C')
insert into tb values(7 ,'G', 'B', 'A', 'C')
go

declare @sql varchar(8000)
select @sql=isnull(@sql + 'select left(reverse(','') + name + '),1) a from tb union '
from syscolumns where id=object_id('tb') and name != 'ID'
select @sql='select max(a) 最大值 from (select left(reverse(' + left(@sql,len(@sql) - 5) + ') t'
--print @sql
exec(@sql)

drop table tb

/*
最大值  
---- 
S

*/

------解决方案--------------------
用游标吧,这是最笨的方法了

SQL code

declare @Value varchar(10)
declare @Sql varchar(100)
declare @Max varchar(10)

create table #tmp1(maxvalue varchar(10) null)

declare cr_t1 cursor for
select name from syscolumns 
where id=object_id('t1') and name <> 'ID' --从系统表中找到有多少个字段要计算

open cr_t1

FETCH NEXT FROM cr_t1
into @Value

WHILE @@FETCH_STATUS = 0
BEGIN

  exec ('insert into #tmp1 select Max = max('+ @Value +') from tbdde1')

  FETCH NEXT FROM cr_t1 INTO @Value
END
CLOSE cr_t1
DEALLOCATE cr_t1

select max(maxvalue) from #tmp1