2012-05-06 93 views
3

我需要選擇一個不等於某個語句的值本身。如何選擇每列不匹配值的所有行?

SELECT * FROM table WHERE * != "qwerty" 

但不是像

SELECT * FROM table WHERE column_name != "qwerty" 

我怎麼能這樣做?

我有一個像

 1 2 3 4 5 6 7 8 9 10 11 ... ... 
    1 a b c d t h v h d t y ... ... 
    2 g t 5 s h r q q q q q ... ... 
    ... ... 
    ... ... 

一個表,我需要選擇每一個不等於「Q」

值我可以做水木清華像

SELECT * WHERE 1 != q AND 2 != q AND 3 != q ... 

但我有toomany列

+1

如果您可以提供一些示例數據,表格結構和預期輸出,將會有所幫助。 –

+1

我試圖根據我對你想要什麼的理解來澄清你的問題標題,如果我錯了,隨時撤銷我的編輯。 –

+0

你可以使用PHP(或者你喜歡的任何東西)還是需要使用純MySQL? – Kaivosukeltaja

回答

7

試試這個:

SELECT * FROM table WHERE "qwerty" NOT IN (column1,column2,column3,column4,etc) 

又如:

-- this... 
SELECT 'HELLO!' FROM tblx 
WHERE 'JOHN' NOT IN (col1,col2,col3); 

-- ...is semantically equivalent to: 
SELECT 'HELLO!' FROM tblx 
WHERE 'JOHN' <> col1 
    AND 'JOHN' <> col2 
    AND 'JOHN' <> col3; 

數據來源:

​​

如果您正在使用PostgreSQL,你可以做一個快捷方式欄:

select * 
from 
(
select 

    row(tblx.*)::text AS colsAsText, 

    translate(row(tblx.*)::text,'()','{}')::text[] 
     as colsAsArray 

from tblx 
) x 
where 'JOHN' <> ALL(colsAsArray) 

直播測試:http://www.sqlfiddle.com/#!1/8de35/2

的Postgres可以從陣列讓行,'JOHN' <> ALL相當於::

where 'JOHN' NOT IN (SELECT unnest(colsAsArray)) 

現場測試:http://www.sqlfiddle.com/#!1/8de35/6


如果上述真的是你想實現什麼,搜索是多少如果您使用全文搜索,則效果更好



對於MySQL:

select 
    @columns := group_concat(column_name) 
from information_schema.columns 
where table_name = 'tblx' 
group by table_name; 




set @dynStmt := 
    concat('select * from tblx where ? NOT IN (', @columns ,')'); 



select @dynStmt; 

prepare stmt from @dynStmt; 

set @filter := 'JOHN'; 

execute stmt using @filter; 

deallocate prepare stmt; 

現場測試:http://www.sqlfiddle.com/#!2/8de35/49

+0

快速前往sqlfiddle將驗證這是AND http://www.sqlfiddle.com/#!1/6741e/2 –

+0

哦,是的,不是或實際上和AND LOL(+1) – Starx

+1

@MichaelBuen我認爲他想要一種寫入sql語句而不指定列名的方法!這甚至有可能嗎? – Songo

0

也許你可以試試SHOW COLUMNS

SHOW COLUMNS FROM SomeTable 

這將返回所有列信息。

例如:

[Field] => id 
    [Type] => int(7) 
    [Null] => 
    [Key] => PRI 
    [Default] => 
    [Extra] => auto_increment 

然後可以使用邁克爾·布埃諾的回答得到你想要的值:

SELECT * FROM table WHERE "qwerty" NOT IN (columnName1,columnName2,columnName3,columnName4,etc) 
3

這會給你想要的地方表達。

select GROUP_CONCAT(COLUMN_NAME SEPARATOR ' != ''q'' AND ') as Exp 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME = 'YourTable' 

也許你可以在一些動態SQL中使用它,或者將字符串複製到你真正的查詢中。

相關問題