2015-05-15 4 views
3

Предполагая, что у меня есть таблица SQL с именем techsched, как показано ниже, но 800 900 и т. Д. И т. Д., Продолжалось до 2300, каждый из которых представлял собой один часовой блок времени. буквенно-цифровой символ с шестью символами (TPI232) представляет номер билета, присвоенный технологии, а номер билета дублируется через каждый блок времени, на который запланирован технологический процесс. Мне нужно запустить SQL запрос, который может найти номер билета, независимо от того, где он находится в таблице и установите значение строки/столбца, в котором оно установлено в NULL или BLANKИмя подстановочного столбца в запросе UPDATE

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

Я знаю, что ниже не будет и не работает, но его лучший способ продемонстрировать то, что я пытаюсь сделать:

UPDATE techsched SET wildcard_column_name = «» WHERE wildcard_column_name = «FGG342»

Я не знаю, где номер записи может появиться в таблице, так как это можно сделать?

+0

Что такое "800,900,1000..'? Имя столбца или значения –

+0

Это имена колонок – DMSJax

ответ

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

Спасибо, я сожалею о задержанном принятии, что у меня была операция, и отсутствовал в течение нескольких дней. Я раньше не использовал хранимую процедуру, поэтому сейчас изучаю это. – DMSJax

+0

Надеюсь, что ваша операция прошла хорошо. Хранимые процедуры - это исследование работы. Книга или два по разработке базы данных в MySQL может время от времени поддаваться – zedfoxus

0

Я бы предложил вам перестроить структуру таблицы. Например, столбцы могут быть «tech, date, hour, ticket».

+0

Спасибо за ввод, я согласен, но на данный момент проект слишком велик, и текущая настройка таблицы слишком встроена в другой код, чтобы пересмотреть ее по-другому. Я действительно вернул проект на полный месяц. – DMSJax

Смежные вопросы