2011-06-10 173 views
1

有人可以幫助我將以下代碼轉換爲原始SQL語句嗎?將WHERE邏輯轉換爲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 
+0

謝謝!幾乎每個人都明白它的主要想法就像真實性所說的那樣。 – someonewhowillnotbemiss 2011-06-10 06:02:36

回答

1

因爲intType好被定義爲35,僅僅是個案35節適用...

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

如果你想封裝的其他情況下,你將不得不解釋intType適合哪裏?或者你只是想要3個單獨的查詢?

0

一般的轉換模式是

If condition Then ands1 
Else ands2 End If 

成爲

((condition AND ands1) OR ((NOT condition) AND ands2)) 
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 
      ) 
     ) 
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) 
    ) 

不要期望查詢優化器優化它:)。

+0

你忘了'AND [use] = 1' for'intType = 34'。 – 2011-06-10 04:59:27

+0

@Andriy M - 真。謝謝。 – 2011-06-10 05:01:37

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)) 
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參數。