从数据库中选择值为X的表

时间:2013-08-26 08:29:03

标签: mysql

到目前为止,我发现这给了我一个列名为“store_id”的所有表的列表 - 但是如果“store_id”= 4,我只希望它选择列,我怎么能这样做?

现在我用它来查找具有“store_id”列的表。

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('store_id')
AND TABLE_SCHEMA='db1';

2 个答案:

答案 0 :(得分:0)

MySQL中使用IF子句。

SELECT  DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
IF(store_id = 4)
    COLUMN_NAME = store_id
END IF;

您可以使用case声明。

SELECT DISTINCT TABLE_NAME
 FROM INFORMATION_SCHEMA.COLUMNS
WHERE CASE WHEN store_id = 4
           THEN COLUMN_NAME = store_id

答案 1 :(得分:0)

你可以像这样使用动态SQL

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT 
         CONCAT('SELECT ''', TABLE_NAME, 
                ''' table_name FROM ', TABLE_NAME, 
                ' WHERE store_id = 4')
         SEPARATOR ' UNION ALL ')
  INTO @sql
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE COLUMN_NAME = 'store_id'
   AND TABLE_SCHEMA = SCHEMA();

SET @sql = CONCAT(@sql, ' ORDER BY table_name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

示例输出:

| TABLE_NAME |
-------------|
|     table1 |

这是 SQLFiddle 演示


现在,您可以通过将其包装到存储过程中来简化调用结束的事情

DELIMITER $$
CREATE PROCEDURE list_tables(IN _column_name VARCHAR(64), IN _column_value VARCHAR(256))
BEGIN
  SET @sql = NULL;

  SELECT GROUP_CONCAT(DISTINCT 
           CONCAT('SELECT ''', TABLE_NAME, ''' table_name
                     FROM ', TABLE_NAME, 
                  ' WHERE ', _column_name,  ' = ''', _column_value, '''')
           SEPARATOR ' UNION ALL ')
    INTO @sql
    FROM INFORMATION_SCHEMA.COLUMNS
   WHERE COLUMN_NAME = _column_name
     AND TABLE_SCHEMA = SCHEMA();

  SET @sql = CONCAT(@sql, ' ORDER BY table_name');

  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

并像这样使用

CALL list_tables('store_id', '4');

这是 SQLFiddle 演示