UPDATE查询中的通配符列名称

时间:2015-05-15 04:19:56

标签: php mysqli sql-update

假设我有一个名为techsched的SQL表设置如下,但800,900等等一直持续到2300,每个代表一小时的时间段。六个字符的字母数字字符(TPI232)表示分配给技术人员的票号,并​​且在计划技术的每个时间段内重复票号。我需要运行一个SQL查询,它可以找到一个票号,无论它在TABLE中的位置如何,并将找到它的行/列的值设置为NULL或BLANK

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 SET wildcard_column_name =''在哪里,wildcard_column_name =' FGG342'

我不知道表中可能出现的记录号码,那么如何实现呢?

2 个答案:

答案 0 :(得分:0)

我建议你重新设计表格的结构。例如,列可以是" tech,date,hour,ticket"。

答案 1 :(得分:0)

创建一个这样的存储过程并根据您的情况进行调整:

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 ;

当你有机会时,考虑一下这个小项目,可以考虑对表进行规范化:

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