UPDATE 查询中的通配符列名
Wildcard column name in UPDATE query
假设我有一个名为 techsched
的 SQL table 设置如下,但 800,900 等一直持续到 2300,每个代表一个小时的时间块。六个字符的字母数字字符 (TPI232) 代表分配给技术的工单号,并且工单号在技术安排的每个时间块中重复。我需要 运行 一个 SQL 查询,无论它位于 TABLE 中的哪个位置,它都可以找到一个票号,并将找到它的 row/column 的值设置为NULL 或空白
Tech date 800 900 1000 1100 1200
John Doe 05-01-15 DSA123 DSA123 DSA123
Mike Doe 05-01-15 FGG342 FGG342
Bill Doe 05-01-15
Steve Doe 05-01-15 TPI232 TPI232 TPI232
我知道下面的内容不会也不会起作用,但这是展示我正在尝试做的事情的最佳方式:
更新 techsched
设置 wildcard_column_name='' 其中 wildcard_column_name='FGG342'
我不知道记录号可能出现在table的什么位置,请问如何实现?
我建议您重新设计 table 的结构。例如,列可以是 "tech, date, hour, ticket".
像这样创建一个存储过程并对其进行调整以适合您的情况:
delimiter $$
drop procedure if exists clear_values$$
create procedure clear_values(subject char(10))
begin
declare finished int default 0;
declare colname varchar(100);
-- cursor
declare cur_columns cursor for
select column_name
from information_schema.columns
where table_name = 'test'
and data_type = 'char'
and character_maximum_length = 10;
-- data type and length matches the field info
-- in my table
-- handler for when we run out of records to read
declare continue handler for not found
set finished = 1;
open cur_columns;
reading: loop
-- retrieve data until end of records
fetch cur_columns into colname;
if finished = 1 then
leave reading;
end if;
-- create text that will update column's value
set @statement = concat(
'update test ',
'set `', colname, '` = \'\' ',
'where `', colname, '` = \'', subject, '\''
);
-- create a prepared statement from the text
-- and execute it
prepare stmt from @statement;
execute stmt;
deallocate prepare stmt;
end loop reading;
close cur_columns;
end$$
delimiter ;
如果有机会,请考虑规范化 table 假设这是一个小项目:
create table techs (
id int auto_increment primary key,
tech varchar(50)
);
create table schedules (
id int auto_increment primary key,
tech_id int not null,
sched datetime not null,
ticket char(6),
constraint fk_schedules_techs_tech_id
foreign key (tech_id)
references techs (id),
constraint uk_schedules_tech_id_sched
unique (tech_id, sched)
);
insert into techs (tech) values
('Joe'),
('Matt');
insert into schedules (tech_id, sched, ticket) values
(1, '2015-05-01 08:00:00', ''),
(1, '2015-05-01 09:00:00', ''),
(1, '2015-05-01 10:00:00', 'DSA123'),
(2, '2015-05-01 08:00:00', 'FGG324'),
(2, '2015-05-01 09:00:00', 'FGG324'),
(2, '2015-05-01 10:00:00', '');
http://sqlfiddle.com/#!9/19bc3/1
现在当您必须清除 FGG324 的票时,您可以输入:
update schedules set ticket = '' where ticket = 'FGG324';
假设我有一个名为 techsched
的 SQL table 设置如下,但 800,900 等一直持续到 2300,每个代表一个小时的时间块。六个字符的字母数字字符 (TPI232) 代表分配给技术的工单号,并且工单号在技术安排的每个时间块中重复。我需要 运行 一个 SQL 查询,无论它位于 TABLE 中的哪个位置,它都可以找到一个票号,并将找到它的 row/column 的值设置为NULL 或空白
Tech date 800 900 1000 1100 1200 John Doe 05-01-15 DSA123 DSA123 DSA123 Mike Doe 05-01-15 FGG342 FGG342 Bill Doe 05-01-15 Steve Doe 05-01-15 TPI232 TPI232 TPI232
我知道下面的内容不会也不会起作用,但这是展示我正在尝试做的事情的最佳方式:
更新 techsched
设置 wildcard_column_name='' 其中 wildcard_column_name='FGG342'
我不知道记录号可能出现在table的什么位置,请问如何实现?
我建议您重新设计 table 的结构。例如,列可以是 "tech, date, hour, ticket".
像这样创建一个存储过程并对其进行调整以适合您的情况:
delimiter $$
drop procedure if exists clear_values$$
create procedure clear_values(subject char(10))
begin
declare finished int default 0;
declare colname varchar(100);
-- cursor
declare cur_columns cursor for
select column_name
from information_schema.columns
where table_name = 'test'
and data_type = 'char'
and character_maximum_length = 10;
-- data type and length matches the field info
-- in my table
-- handler for when we run out of records to read
declare continue handler for not found
set finished = 1;
open cur_columns;
reading: loop
-- retrieve data until end of records
fetch cur_columns into colname;
if finished = 1 then
leave reading;
end if;
-- create text that will update column's value
set @statement = concat(
'update test ',
'set `', colname, '` = \'\' ',
'where `', colname, '` = \'', subject, '\''
);
-- create a prepared statement from the text
-- and execute it
prepare stmt from @statement;
execute stmt;
deallocate prepare stmt;
end loop reading;
close cur_columns;
end$$
delimiter ;
如果有机会,请考虑规范化 table 假设这是一个小项目:
create table techs (
id int auto_increment primary key,
tech varchar(50)
);
create table schedules (
id int auto_increment primary key,
tech_id int not null,
sched datetime not null,
ticket char(6),
constraint fk_schedules_techs_tech_id
foreign key (tech_id)
references techs (id),
constraint uk_schedules_tech_id_sched
unique (tech_id, sched)
);
insert into techs (tech) values
('Joe'),
('Matt');
insert into schedules (tech_id, sched, ticket) values
(1, '2015-05-01 08:00:00', ''),
(1, '2015-05-01 09:00:00', ''),
(1, '2015-05-01 10:00:00', 'DSA123'),
(2, '2015-05-01 08:00:00', 'FGG324'),
(2, '2015-05-01 09:00:00', 'FGG324'),
(2, '2015-05-01 10:00:00', '');
http://sqlfiddle.com/#!9/19bc3/1
现在当您必须清除 FGG324 的票时,您可以输入:
update schedules set ticket = '' where ticket = 'FGG324';