If I have a value in column WorkoutID that looks like 100,10,7
and I want to remove the value 10 from this, I can use the following SQL script:
UPDATE
UserDB.Programs
SET
WorkoutID = REPLACE(WorkoutID, ',10','')
WHERE
ProgramID = '7172';
which would correctly output 100,7.
The expected outcome ALWAYS needs to be
number, number, or number
NOT number,,number, or number, or ,number
which makes it tricky because in the replace statement, i need to look for the value, but how can I assume the comma position? i.e replace(WorkoutID, ',10', ''), or replace(WorkoutID, '10,', '')
CodePudding user response:
As others pointed out in the comment, you should not store comma separated values in a single column.
But in case you have no control over the data, here is a solution.
The problem with your solution is that you may unintentionally remove parts of other values, i.e. if you have something like 100,10,7,1000 and remove ,10, you will get 100,700...
One solution would be to add a leading and trailing comma to the original string, then replace the value enclosed with commas (i.e. ,10,), then remove the added leading and trailing commas.
Example :
CREATE TABLE program (ProgramID INT, WorkoutID TEXT);
INSERT INTO program VALUES (1, '100,12,4,55,120,212,45');
SELECT TRIM(BOTH ',' FROM REPLACE(CONCAT(',', WorkoutID, ','),',12,',','))
FROM program;
Result :
100,4,55,120,212,45
There may be other solutions using JSON paths etc. but I think this one is pretty fast and understandable.
