2016-01-15 120 views
3

我有一個表叫Attendance和列名爲attendanceStatusCourseID。該attendanceStatus列是一個文本類型,因爲我希望能夠改變每個01在任何給定的階段。數據充滿了0的,但我希望在字符串中改變過去01。數據包含18個0's,所以這將是我需要改變的第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艾克 '2%' 和attendancestatus LIKE '%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你說得對,我解決了。 –