1

私はこれを持っています:

SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name = 'whatever'

しかし、私が必要とするのは次のようなものです:

SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_data = 'whatever'

言い換えれば、私には値があり、それがどこに保存されているかわかりません。文字通りデータベース全体をチェックして、テーブル、列を返す方法はありますか?

ああ、はい、わかっています。データベース管理者は満足しないでしょう!

4

1 に答える 1

1

これにより、正しい方向に進む可能性があります。

1.find_columnストアド プロシージャの作成

DROP PROCEDURE IF EXISTS `find_column`;

DELIMITER $$

CREATE PROCEDURE `find_column`(IN i_value varchar(200),
                               OUT o_columns varchar(2000),
                               OUT o_message varchar(500))
MAIN_BLOCK : BEGIN

 DECLARE is_numeric boolean;

 CHECK_NUMERIC : BEGIN
   set is_numeric = i_value REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';
 END CHECK_NUMERIC;


 FIND_IT : BEGIN

   DECLARE bNoMoreRows BOOLEAN DEFAULT FALSE;
   DECLARE v_schema varchar(64);
   DECLARE v_table varchar(64);
   DECLARE v_column varchar(64);
   DECLARE v_data_type varchar(64);
   DECLARE v_count int;


   -- all schemas, tables and columns in DB
   DECLARE columns CURSOR FOR
   select table_schema,table_name,column_name,data_type from information_schema.columns;

   DECLARE EXIT HANDLER for SQLEXCEPTION set o_message := concat('Unexpected error while trying to find schema, table and column for value : ',i_value);
   declare continue handler for not found set bNoMoreRows := true; 

   open columns;

   set o_columns = "";

   COLUMN_LOOP: loop
    fetch columns
    into v_schema,v_table,v_column,v_data_type;

    if (
        (v_data_type in ('int','bigint','tinyint','decimal','smallint','mediumint')      and is_numeric=1)
     or (v_data_type not in ('int','bigint','tinyint','decimal','smallint','mediumint') and is_numeric=0)
       )
     then 


     SET @dyn_sql=CONCAT('select count(*) into @c from `',v_schema,'`.`',v_table,'` where `',v_column,'`=?');

     SET @c = 0;
     SET @v_value = i_value;
     PREPARE stmt FROM @dyn_sql;
     EXECUTE stmt using @v_value;
     DEALLOCATE PREPARE stmt; 

     SET v_count = @c;

     if v_count > 0 then

       if length(o_columns <= 1800) then 
        set o_columns = concat(o_columns,",",v_schema,".",v_table,".",v_column);
        end if;
     end if;
    end if;

     if bNoMoreRows then
      set o_columns = substring(o_columns,2);
      close columns;
     leave COLUMN_LOOP;
    end if;

   END loop COLUMN_LOOP;

 END FIND_IT;

END MAIN_BLOCK$$

DELIMITER ;

2.find_column値を使用してストアドプロシージャを呼び出します

call `find_column`('whatever',@columns,@message);

3. 結果を確認する

select @columns;

is_numeric ビットは、この投稿からJBBの回答を愛情を込めて切り取ったものです。

完璧ではありません (値が存在する列の数が 10 程度を超える場合はどうなりますか?その場合、最初の 10 程度の列のみが返されます (schema.table.column 名の長さによって異なります)。文字列です)。

うまくいけば、それがあなたを正しい方向に導くでしょう。

あなたは正しいです。DB管理者はあなたに不満を抱くでしょう。しかし、たまに彼らを苛立たせなければ、あなたは十分な努力をしていないということになります ;-)

幸運を。

于 2012-08-11T18:53:23.930 に答える