2011-01-19 15 views
2
SELECT * FROM foobar 
    WHERE userid != '100' AND col1 REGEXP '[[:<:]]test[[:>:]]' 
    OR userid != '100' AND col2 REGEXP '[[:<:]]test[[:>:]]' 
    OR userid != '100' AND col3 REGEXP '[[:<:]]test[[:>:]]' 

此查詢爲我工作正常。它基本上會過濾兩個標準如何修改這個特定的查詢?

  1. 其中COL1 COL2或或COL3有「測試」和
  2. 用戶ID是不是100

我還有一個col4這是我想要的,比其他above two condition,它必須篩選出那些結果col4 = 'y'

我該如何修改上述查詢?

回答

2

您的查詢中有錯誤,您需要將第二個col2更改爲col3。如果您重新格式化代碼,則更容易看到錯誤:

SELECT * FROM foobar 
WHERE (userid != '100' AND col1 REGEXP '[[:<:]]test[[:>:]]') OR 
     (userid != '100' AND col2 REGEXP '[[:<:]]test[[:>:]]') OR 
     (userid != '100' AND col2 REGEXP '[[:<:]]test[[:>:]]') 

我還添加了括號以使評估順序清晰。您可以重寫您的查詢以避免重複表達userid != '100'。然後,只需添加缺少的子句:

SELECT * FROM foobar 
WHERE userid != '100' 
AND col4 <> 'y' 
AND (
    col1 REGEXP '[[:<:]]test[[:>:]]' OR 
    col2 REGEXP '[[:<:]]test[[:>:]]' OR 
    col3 REGEXP '[[:<:]]test[[:>:]]' 
) 
0
SELECT * 
    FROM foobar 
    WHERE userid != '100' 
     AND (col1 REGEXP '[[:<:]]test[[:>:]]' 
      OR col2 REGEXP '[[:<:]]test[[:>:]]' 
      OR col3 REGEXP '[[:<:]]test[[:>:]]') 
     AND col4 <> 'y' 
+0

,應該不是最後一次檢查被逆轉? – Brandon 2011-01-19 20:42:49

+0

@Brandon:Jinx。我想我們都在同一時間捕捉到了這一點。 – 2011-01-19 20:43:19

1

像這樣的事情?您也可以將userid != '100'分開,因爲這三項檢查很常見。

SELECT * 
FROM foobar 
WHERE userid != '100' 
    AND (col1 REGEXP '[[:<:]]test[[:>:]]' 
     OR col2 REGEXP '[[:<:]]test[[:>:]]' 
     OR col3 REGEXP '[[:<:]]test[[:>:]]') 
    AND col4 != 'y' 
0

試試這個:如果他要過濾掉COL4 = 'Y' 結果

SELECT * 
    FROM foobar 
WHERE col4 = 'y' 
    OR (
       userid != '100' 
       AND (
           col1 REGEXP '[[:<:]]test[[:>:]]' 
           OR 
           col2 REGEXP '[[:<:]]test[[:>:]]' 
           OR 
           col2 REGEXP '[[:<:]]test[[:>:]]' 
          ) 
       ) 
0
SELECT * FROM foobar WHERE 
(userid != '100') AND 
(col1 REGEXP '[[:<:]]test[[:>:]]' OR userid != '100' OR col2 REGEXP '[[:<:]]test[[:>:]]' OR col2 REGEXP '[[:<:]]test[[:>:]]') 
AND col4 <> 'y'