0

到目前为止,我发现这给了我一个包含列名为“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';
4

2 回答 2

0

中使用 IF 子句MySQL

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
于 2013-08-26T08:33:48.813 回答
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;

样本输出:

| 表名 |
-------------|
| 表1 |

这是SQLFiddle演示


现在您可以通过将其包装到存储过程中来简化调用 end

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演示

于 2013-08-26T09:07:39.840 回答