MySQL SELECT来自TABLE WHERE FIELD TITLE不喜欢

时间:2014-03-31 14:59:57

标签: mysql sql

是否可以在MySQL中执行以下操作

  

SELECT * FROM'表名'WHERE'字段名称'NOT LIKE'%string%';

我正在研究之前由其他人设置的数据库 - 根据位置有很多针对鞋码的字段标题 - 即quantity_size_125_grantham

我想运行一个查询,它将从数据库中选择所有列和行,其中字段标题名称不是'%grantham%'。 quantity_size_ integer _ * location *有多列我想排除。

这可能吗?

谢谢,

1 个答案:

答案 0 :(得分: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的所有行。