2016-01-15 2 views
3

У меня есть таблица под названием Attendance и столбцы с именем attendanceStatus и CourseID. Столбец attendanceStatus является текстовым типом, потому что я хочу иметь возможность изменять каждый 0 до 1 на любом данном этапе. Данные заполняются 0, но я хочу изменить последние 0 в строке на 1. Данные содержат 18 0, так что это будет 18-й символ, который мне нужно будет изменить.Замена определенного символа в строке

Я чувствую, что я подошел близко к этому, но я готов прислушаться к его изменению, если я не близко.

UPDATE Attendance 
SET attendanceStatus REPLACE = (attendanceStatus, '0', '1') 
WHERE CourseID like '2%'; 

Я понимаю, что этот код изменяет все в 0-х до 1-х, и я только хочу, чтобы изменить 18 0.

+0

'посещаемости обновление устанавливается attendancestatus = CONCAT (подстроки (attendancestatus, 1,17), '1'), где courseID LKE '2%' и attendancestatus как '% 0' ; ' – xQbert

+0

Учитывая этот тип требования, кажется, что этот столбец содержит более одного отдельного значения. Если вы хотите изменить значение одного символа в определенной позиции в столбце символов (в таблице MySQL), решение для этого будет включать функцию ** 'SUBSTRING' ** (для извлечения частей строку, которую вы хотите оставить без изменений) и ** ** CONCAT' ** (чтобы объединить части строки обратно вместе). Более надежное решение, вероятно, также вызовет функцию ** 'CHAR_LENGTH' **, чтобы выполнить проверки работоспособности. И эти выражения будут уродливыми. – spencer7593

ответ

8

Вы сохраняете статус присутствия, используя неправильный метод. Хотя я могу понять, почему вы храните их в строке, это действительно громоздко. Как вы собираетесь отвечать: Сколько учеников посещало не менее 10 дней? Сколько учеников было на 6-й день? Сколько учеников отсутствовало три дня подряд?

Правильный метод состоит в том, чтобы иметь отдельную строку для каждого «дня» (я не уверен, что такое правильные единицы). Было бы что-то вроде:

create table StudentAttendance (
    StudentAttendanceId int not null primary key auto_increment, 
    StudentId int not null references Student(StudentId), 
    CourseId int not null references Courses(CourseId), 
    Date date, 
    status char(1), 
    constraint unq_scd unique (StudentId, CourseId, Date) 
); 
0
UPDATE Attendance 
SET attendanceStatus = CONCAT(SUBSTRING(attendanceStatus, 
             1, 
             CHAR_LENGTH (attendanceStatus) - 1 
             ), 
           '1') 
WHERE CourseID like '2%'; 
+0

@ spencer7593 Вы правы, я исправлю это. –

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