条件放在表中的SQL查询的解决方案

    技术2022-05-11  58

    条件放在表中的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)、条件有有限的多种类型的情况。

    代码由上面类似,只是不上面稍微复杂一点。

    最好写一个用户自定义函数实现之。

    (三)、条件有多种,并且是大量时。

    在这种情况下,应该是考虑使用游标或循环实现了。


    最新回复(0)