2012-02-22 257 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