2014-03-31 50 views
0

是否有可能做在MySQLMySQL的SELECT from表where字段標題不喜歡

SELECT * FROM '表名' 下面的WHERE '字段名' NOT LIKE '%字符串%';

我以前的工作由其他人建立了一個數據庫上 - 有很多字段標題的基於位置的鞋碼 - 即quantity_size_125_grantham

我想運行一個查詢,將選擇所有列以及字段標題名稱不是LIKE'%grantham%'的數據庫中的行。 quantity_size_ 整數 _ *位置*有多列,我想排除。

這可能嗎?

感謝,

+0

您應該對字段名稱和表名使用反碼,而不是單引號:'SELECT * FROM \'表名\ WHERE \'字段名'NOT LIKE'%string%';' – Prix

+2

調整你的查詢來選擇你實際上想要使用的字段,而不是使用* –

+0

除了Morten的評論之外,如果你有時間這樣做,我還會建議對數據庫進行規範化。正如我所看到的那樣,數據庫的設計很糟糕,你肯定會在將來再花更多時間處理這種垃圾。 –

回答

0

不,這是不可能的動態創建一個SQL語句,並在一個語句中執行它。它可以分兩步完成。

有可能檢索來自information_schema數據庫列的元數據,從columns,例如:

SELECT c.* 
    FROM information_schema.columns c 
WHERE c.column_name NOT LIKE '%string%' 
    AND c.table_schema = 'mydatabase' 
    AND c.table_name = 'mytable' 
ORDER BY c.table_name, c.ordinal_position 

由於MySQL的語句定義要返回的列,這是不可能的動態包括/排除查詢中的列。

可以使用information_schema數據庫來幫助您創建一個SQL語句,這樣的事情,作爲一個例子:

SELECT CONCAT('SELECT ' 
     ,GROUP_CONCAT(CONCAT('t.`',c.column_name,'`') ORDER BY c.ordinal_position) 
     ,' FROM `',c.table_name,'` t' 
     ) AS stmt 
    FROM information_schema.columns c 
WHERE c.table_schema = 'mydatabase' 
    AND c.table_name = 'mytable' 
    AND c.column_name NOT LIKE '%string%' 
GROUP BY c.table_name 

注:GROUP_CONCAT函數返回的字符串的長度被限制group_concat_max_lenmax_allowed_packet變量。

該查詢只返回一個字符串;它並不實際執行生成的語句。這需要作爲一個單獨的步驟來完成。


是的,這是可能的。但不要在標識符周圍使用單引號。

如果您需要「引用」標識符,MySQL標準是使用反引號。 (這也可以使用雙引號,如果SQL_MODE包括ANSI_QUOTES

此:

SELECT t.* 
    FROM `table_name` t 
WHERE t.`field_name` NOT LIKE '%string%' 

會從那裏在 field_name列值未設置爲NULL返回表中的所有行和值不包含字符串 string

+0

對不起,我沒有完全關注這一點 - 我剛剛使用了以下內容,它什麼都不返回? :$ sql =「SELECT t。* FROM'product' t WHERE t.'field_name' NOT LIKE'%grantham%'AND t.'field_name' NOT LIKE'%middlegate%'AND t.'field_name' NOT LIKE '%鏈%'」; – Aphex22

+1

@ Aphex22請不要使用編輯來回復答案。您可以在評論中回覆,或者在答覆澄清或向問題本身添加相關信息時編輯您的問題。 –

+0

我剛剛意識到,我的上面的評論可能是非常混亂的背景。爲了澄清,他提交了答覆作爲[建議編輯的答案](http://stackoverflow.com/review/suggested-edits/4465862)(被拒絕)。 –

相關問題