2012-02-22 156 views
22

请帮我写符合条件的SQL查询为“不喜欢”SQL查询与不喜欢

Select * from Table1 where EmpPU NOT Like IN ('%CSE%', '%ECE%', '%EEE%') 

得到错误。

+1

可能重复是否可以使用LIKE和IN的一个WHERE语句?](http://stackoverflow.com/questions/4335359/is-it-possible-to-use-like-and-in-for-a-where-statment) – onedaywhen 2012-02-22 11:28:02

回答

53

你不能像结合在下面的语句会虽然做的工作:

Select * from Table1 
where EmpPU NOT Like '%CSE%' 
AND EmpPU NOT Like '%ECE%' 
AND EmpPU NOT Like '%EEE%' 
0

你可以试试这个

Select * from Table1 where 
    EmpPU NOT Like '%CSE%' 
AND EmpPU NOT Like '%ECE%' 
AND EmpPU NOT Like '%EEE%' 
+0

我想在一个一个去所有的参数,而不是写多个'不喜欢'单词 – venkat 2012-02-22 11:01:21

+0

将'ERROR'作为'Msg 156,Level 15,State 1,Line 3 关键字'Like'附近的语法不正确。' – venkat 2012-02-22 11:02:37

13

那是因为你是混合两种语法在一起。

如果你总是有这三个值,那么你可以将三个LIKE表达式的结果进行AND。

SELECT 
    * 
FROM 
    Table1 
WHERE 
     EmpPU NOT LIKE '%CSE%' 
    AND EmpPU NOT LIKE '%ECE%' 
    AND EmpPU NOT LIKE '%EEE%' 

如果您需要为“任意数量”的值执行此操作,可以将值放入表中并进行连接。

WITH 
    myData 
AS 
(
      SELECT '%CSE%' AS match 
    UNION ALL SELECT '%ECE%' AS match 
    UNION ALL SELECT '%EEE%' AS match 
) 

SELECT 
    * 
FROM 
    Table1 
LEFT JOIN 
    myData 
    ON Table1.EmpPU LIKE myData.match 
WHERE 
    myData.match IS NULL 

或者......

WITH 
    myData 
AS 
(
      SELECT '%CSE%' AS match 
    UNION ALL SELECT '%ECE%' AS match 
    UNION ALL SELECT '%EEE%' AS match 
) 

SELECT 
    * 
FROM 
    Table1 
WHERE 
    NOT EXISTS (SELECT * FROM myData WHERE Table1.EmpPU LIKE match) 
1

或者你也可以做这样的:

SELECT 
    * 
FROM 
    Table1 
WHERE NOT EXISTS 
    (
     SELECT 
      NULL 
     FROM 
     (
      SELECT '%CSE%' AS column1 UNION ALL 
      SELECT '%ECE%' UNION ALL 
      SELECT '%EEE%' 
     ) AS tbl 
     WHERE Table1.EmpPU LIKE tbl.column1 
    ) 
3

你不能结合LIKE和IN

你可以这样做:

select * from Table1 
where EmpPU not in ('%CSE%', '%ECE%', '%EEE%') 

但你从%通配符

惯于好处,如果你需要的%的唯一选择就是:

Select * from Table1 
where EmpPU not like '%CSE%' and EmpPU not like '%ECE%' and EmpPU not like '%EEE%' 
+0

除了您的意思是'AND'而不是'OR'吗?你还需要在那里指定字段名称? * [这个答案的最后部分是与删除的答案相同的字符的字符...] * – MatBailie 2012-02-22 11:24:23

+0

不,它的OR。只有其中一个条件必须为真才能排除记录。必须排除其中含有“EEE”的行,但它不像CSE – Diego 2012-02-22 11:34:25

+1

这就是要点。如果WHERE子句的计算结果为true,则包含***行***以SMEEEG作为示例并尝试您的代码...('SMEEEG'不是'%CSE%')或('SMEEEG'不是'%ECE%')或('SMEEEG'不是'%EEE%')'=>'(TRUE)或(TRUE) OR(FALSE)'=>'TRUE'。你的代码包含''SMEEEG',即使它***就像'%EEE%'。你需要'NOT((x LIKE a)OR(x LIKE b)OR(x LIKE c))'或者你需要'(x NOT LIKE a)和(x NOT LIKE b)AND(x NOT LIKE c)''。无论哪种方式,你有什么都行不通。抱歉。 – MatBailie 2012-02-22 11:39:45

6

如果您已设置要包括/从一个特定的列在搜索排除的字词。你可能想使用mysql的正则表达式函数。

排除组词从一列:从列

SELECT 
    * 
FROM 
    Table1 
WHERE 
     EmpPU NOT REGEXP 'CSE|ECE|EEE'; 

搜索词的集合:

SELECT 
    * 
FROM 
    Table1 
WHERE 
     EmpPU REGEXP 'CSE|ECE|EEE'; 
的[
+0

这是一个更好的答案,因为它更符合'NOT LIKE IN(...)'的要求,这使得查询更容易。在性能方面,正则表达式可能更难。 – Jabberwockey 2015-11-16 11:46:55

+0

OP在询问T-SQL。 – 2017-01-27 09:44:18

+0

这是一个很好的解决方案。 – aavrug 2017-06-24 17:29:01