2011-01-19 90 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'