gpt4 book ai didi

mysql - 在仅给出一个值的多个表之一中查找一列?

转载 作者:行者123 更新时间:2023-11-29 00:41:56 25 4
gpt4 key购买 nike

我有这个:

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'

所以,换句话说,我有一个值,但我不知道它存储在哪里。有没有办法从字面上检查整个数据库并返回表,列?

aaa 是的,我知道,数据库管理员不会高兴!

最佳答案

这可能会让您朝着正确的方向前进。

<强>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来自 this post 的回答.

它并不完美(如果您的值存在的列数超过 10 左右会发生什么情况?如果是这种情况,那么它只会返回前 10 列左右(取决于 schema.table 的长度) .column name string is).

希望它能让您朝着正确的方向前进。

你是对的。你是数据库管理员会对你不满意。但是,如果你不偶尔惹恼他们,那么恕我直言,你还不够努力 ;-)

祝你好运。

关于mysql - 在仅给出一个值的多个表之一中查找一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11907018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com