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';