替换字符串中的特定字符

3
我有一个名为Attendance的表,其中包含attendanceStatusCourseID两列。由于我希望能够在任何给定阶段将每个0更改为1,因此attendanceStatus列是文本类型。数据中填充了许多0,但我希望将字符串中最后一个0更改为1。数据包含18个0,因此需要更改第18个字符。
我觉得我已经接近成功了,但如果我没有接近,请告诉我怎样完全更改它。
UPDATE Attendance
SET attendanceStatus REPLACE = (attendanceStatus, '0', '1')
WHERE CourseID like '2%';

我知道这段代码会把所有的0都变成1,但我只想把第18个0变成1。

update attendance set attendancestatus = concat(substring(attendancestatus,1,17),'1') where courseID lke '2%' and attendancestatus like '%0'; - xQbert
考虑到这种要求,似乎该列包含多个不同的值。如果您想要更改MySQL表中字符列中某个位置上单个字符的值,则解决方案将涉及**SUBSTRING函数(提取要保留不变的字符串部分)和CONCAT函数(将字符串部分连接在一起)。更健壮的解决方案可能还需要调用CHAR_LENGTH**函数进行健全性检查。而这些表达式看起来会很丑陋。 - spencer7593
2个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接