不,這是不可能的動態創建一個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_len
和max_allowed_packet
變量。
該查詢只返回一個字符串;它並不實際執行生成的語句。這需要作爲一個單獨的步驟來完成。
是的,這是可能的。但不要在標識符周圍使用單引號。
如果您需要「引用」標識符,MySQL標準是使用反引號。 (這也可以使用雙引號,如果SQL_MODE
包括ANSI_QUOTES
)
此:
SELECT t.*
FROM `table_name` t
WHERE t.`field_name` NOT LIKE '%string%'
會從那裏在
field_name
列值未設置爲NULL返回表中的所有行和值不包含字符串
string
。
您應該對字段名稱和表名使用反碼,而不是單引號:'SELECT * FROM \'表名\ WHERE \'字段名'NOT LIKE'%string%';' – Prix
調整你的查詢來選擇你實際上想要使用的字段,而不是使用* –
除了Morten的評論之外,如果你有時間這樣做,我還會建議對數據庫進行規範化。正如我所看到的那樣,數據庫的設計很糟糕,你肯定會在將來再花更多時間處理這種垃圾。 –