条件放在表中的SQL查询的解决方案
当把查询条件放在表的某个列中,需要根据这些条件进行查询或其它操作时。大体分为以下几种情况。
(一)、条件有多种,并且是少量时。
例如:
表TableA:
TableName RowNum strSQL
-----------------------------------------------
TableB 1 acc Between 1 and 9
TableB 2 acc Between 11 and 19
TableB 3 acc in (1,3,5)
TableB 4 cls like 'cls%'
TableC 5 acc Between 10 and 100
……
表TableB
RowNum acc cls qty
----------------------------------------
1 1 cls 100
1 5 c 200
1 8 cl 300
1 10 clscs 400
2 0 c 500
2 15 a 600
2 20 s 700
4 2 l 800
4 3 cls 900
4 4 clsear 1000
……
由于条件较少,可使用动态SQL实现。
Declare @strTableName varchar(20)
Set @strTableName='TableB'
Declare @strSQL varchar(8000)
Set @strSQL=''
Select @strSQL=@strSQL+'Select '+Cast(RowNum As Varchar) +' As RowNum,Sum(Isnull(Qty,0)) As TotalQty
From +@strTableName +' where '+ @strSQL +' Union All '
From TableA
Where TableName = @strTableName
Set @strSQL ='Select * From ( '+Substring(@strSQL ,1,Len(@strSQL)-10)+')T'
Exec(@strSQL)
(二)、条件类型有有限种,并且是大量时。
(1)条件只有一种类型的情况。
例如:
表TableA:
TableName RowNum strSQL
-----------------------------------------------
TableB 1 acc Between 1 and 9
TableB 2 acc Between 11 and 19
TableB 3 acc Between 11 and 19
TableB 4 acc Between 11 and 19
TableB 5 acc Between 10 and 100
……
表TableB
RowNum acc cls qty
----------------------------------------
1 1 cls 100
1 5 c 200
1 8 cl 300
1 10 clscs 400
……
Select RowNum,Sum(Isnull(Qty,0)) As TotalQty
From TableB
Where acc Between Cast(Substring(strSQL,Charindex('Between',strSQL)+8,Charindex('and',strSQL)-Charindex('Between',strSQL)-8) As Integer) And Right(,strSQLCharindex('and',strSQL)+4)
(2)、条件有有限的多种类型的情况。
代码由上面类似,只是不上面稍微复杂一点。
最好写一个用户自定义函数实现之。
(三)、条件有多种,并且是大量时。
在这种情况下,应该是考虑使用游标或循环实现了。