I am using SQL Server and SSMS.
I have the following code:
x
UPDATE Table
SET [Code] = REPLACE(((REPLACE([CODE]), 'G1', 'G2')
WHERE LEN([CODE]) = 2), 'C11', 'C33')
WHERE LEN([CODE]) = 3
But I get the following error:
Msg 174, Level 15, State 1, Line 2
The replace function requires 3 argument(s).
I’d like to change G1 to G2 and C11 to C33. This is a small sample of a much larger code I’d like to build replacing many other similar codes.
Advertisement
Answer
You can use CASE for your “if” logic in SQL, so like this:
UPDATE Table
SET [Code] =
CASE
WHEN LEN([Code]) = 2 THEN REPLACE([CODE],'G1','G2')
WHEN LEN([Code]) = 3 THEN REPLACE([CODE],'C11','C33')
ELSE [Code] -- lets be safe!
END
WHERE
LEN([Code]) IN (2,3) -- let be safe again!
You can use more conditions too:
UPDATE Correspondence
SET [CPZ Code] =
CASE
WHEN LEN([CPZ Code]) = 1 AND [CPZ Code] = 'A' THEN 'A1'
WHEN LEN([CPZ Code]) = 1 AND [CPZ_Code] = 'B' THEN 'A2'
WHEN LEN([CPZ Code]) = 2 AND [CPZ_Code] = 'C1' THEN 'C1' -- not needed
WHEN LEN([CPZ Code]) = 2 AND [CPZ Code] = 'C2' THEN 'C2' -- not needed
WHEN LEN([CPZ Code]) = 2 AND [CPZ Code] = 'SW' THEN 'S1'
ELSE [CPZ Code] -- lets be safe!
END
WHERE
[CPZ Code] IN ('A', 'B', 'C1', 'C2', 'SW') -- lets be safe again!
At this point it is starting to look like a lookup table would be nice though.
CREATE TABLE #temp(OldCode varchar(10), NewCode varchar(10))
INSERT INTO #temp
VALUES
('A', 'A1'),
('B', 'A2'),
('C1', 'C1'),
('C2', 'C2'),
('SW', 'S1')
UPDATE t1
SET t1.[CPZ Code] = t2.NewCode
FROM Correspondence t1
INNER JOIN #temp t2
ON t1.[CPZ Code] = t2.OldCode