将WHERE逻辑转换为SQL语句

时间:2011-06-10 03:57:52

标签: sql

有人可以帮我将以下代码转换为原始SQL语句吗?

(不是动态SQL)

Dim blnAllow as Boolean = True

Dim intType as Int32 = 35

.Append("SELECT * FROM TABLE1 WHERE NAME='AAA' ")

Select Case intType

                    Case 35
                        .Append("AND (Type IN (2,4) OR type=8) ")
                        .Append("AND [use]=1 ")
                    Case 34
                        If blnAllow = True Then
                            .Append("AND (Type IN (2,4) OR (type=8 and Col1 > 0 )) ")
                        Else
                            .Append("AND (Type IN (2,4)) ")
                        End If
                        .Append(" AND [use]=1 ")
                    Case Else
                        .Append("AND Type=1")
End Select

6 个答案:

答案 0 :(得分:1)

因为intType被定义为35,所以只有案例35部分适用...

select * from TABLE1 where [NAME]='AAA'
    and [Type] in (2,4,8)
    and [use] = 1

如果你想封装那些其他情况,你必须解释intType适合的位置..或者你只想要3个单独的查询?

答案 1 :(得分:1)

这样的事情

SELECT  * 
FROM    TABLE1 WHERE NAME='AAA'
AND     (
            (
                    intType = 35
                AND (Type IN (2,4) OR type=8)
                AND [use]=1
            )
            OR
            (
                    intType = 34
                AND (
                        (
                                blnAllow = 'true'
                            AND (Type IN (2,4) OR (type=8 and Col1 > 0 )) 
                        )
                        OR
                        (
                                blnAllow = 'false'
                            AND (Type IN (2,4)) 
                        )
                    )
                AND [use]=1
            )
            OR
            (
                    intType NOT IN (35, 34)
                AND Type=1
            )
        )

答案 2 :(得分:0)

一般转换模式是

If condition Then ands1
Else ands2 End If

变为

( (condition AND ands1) OR ((NOT condition) AND ands2) )

答案 3 :(得分:0)

在MS SQL中,这将如下所示:

DECLARE @blnAllow BIT
SET @blnAllow = 1

DECLARE @intType INT
SET @intType = 35

SELECT * 
FROM TABLE1 
WHERE 
    NAME = 'AAA' AND
    (
        (@intType = 35 AND (Type IN (2,4) OR type = 8) AND [use] = 1) OR
        (@intType = 34 AND [use] = 1  AND
            (
                (@blnAllow = 1 AND (Type IN (2,4) OR (type = 8 and Col1 > 0 ))) OR
                (@blnAllow = 0 AND (Type IN (2,4)))
            )) OR
        (@intType not in (34, 35) AND Type = 1)
    )

不要指望查询优化器对其进行优化:)。

答案 4 :(得分:0)

请尝试这个最优化的查询。

select * from table where name = 'AAA' AND
    (
        (
            ((Type IN (2,4) OR type=8) OR // Case 35
                (       
                    (Type IN (2,4) OR (type=8 and Col1 > 0 )) // Case 34 and blnAllow checking
                )
            )
            AND [use]=1 // Case 35 && 34
        ) OR     
        (Type=1) // Else
    )

If the string "Type" and "type" indicates the same field, You just modifify the 
//case 35 section to (Type IN (2,4) OR type=8) => (Type IN (2,4,8))

答案 5 :(得分:0)

…
WHERE NAME = 'AAA'
  AND (@intType NOT IN (34, 35) AND Type = 1
    OR @intType IN (34, 35) AND [use] = 1 AND (
         Type IN (2, 4)
      OR @intType = 35 AND Type = 8
      OR @intType = 34 AND (@blnAllow = 0 OR Type = 8 AND Col1 > 0)
    )
  )

假设@intTypeint参数,而@blnAllowbit参数。