简体   繁体   中英

Replace Matching Row String From Another Column

I have this table:

ID NewName  OldName  Link
 1 NewName1 OldName1 OldName2|OldName3
 2 NewName2 OldName2 OldName1|OldName3
 3 NewName3 OldName3 OldName1|OldName2

What I want to happen is to change all the OldName on the Link column to the NewName . Like this:

ID NewName  OldName  Link
 1 NewName1 OldName1 NewName2|NewName3
 2 NewName2 OldName2 NewName1|NewName3
 3 NewName3 OldName3 NewName1|NewName2

Can anyone suggest what's the best way to do this?

You are looking to Change the value of Link according OldNames to its with New Names:

First you will need to split your Link data delimited by | into row & then Join with Your Table

SELECT TTT.ID,
       TTT.[NewName],
       TTT.OldName,
       [Link] = STUFF(
                     (
                         SELECT 
                                '|'+[Link]
                         FROM
                         (
                             SELECT AA.ID,
                                    AA.[NewName],
                                    AA.OldName,
                                    T.[NewName] [Link]
                             FROM
                             (
                                 SELECT ID,
                                        NewName,
                                        OldName,
                                        split.x.value('.', 'NVARCHAR(MAX)') DATA
                                 FROM
                                 (
                                     SELECT ID,
                                            NewName,
                                            OldName,
                                            CAST('<M>'+REPLACE(Link, '|', '</M><M>')+'</M>' AS XML) AS String
                                     FROM <table_name>
                                 ) AS a
                                 CROSS APPLY String.nodes('/M') AS split(x)
                             ) AA
                             INNER JOIN <table_name> T ON T.OldName = AA.DATA
                         ) TT
                         WHERE TT.ID = TTT.ID FOR XML PATH('')
                     ), 1, 1, '')
FROM <table_name> TTT;

Result :

ID  NewName     OldName     Link
1   NewName1    OldName1    NewName2|NewName3
2   NewName2    OldName2    NewName1|NewName3
3   NewName3    OldName3    NewName1|NewName2

MSSQL: To store delimited-values from other column/other sources to a specific row, you may use FOR XML PATH , look at this SO thread :

UPDATE YourTable
SET Link = SUBSTRING(
        (
            SELECT '|' + T2.NewName
            FROM YourTable T2
            WHERE '|'+T2.Link+'|' LIKE '%|'+YourTable.OldName+'|%'
            FOR XML PATH ('')
        ), 2, 1000);

MYSQL: If you want to store delimited-values from other column/other sources to a specific row, you may use mysql GROUP_CONCAT function:

UPDATE table t1
SET Link = (
    SELECT GROUP_CONCAT(t2.NewName SEPARATOR '|')
    FROM table t2 WHERE FIND_IN_SET(t2.OldName, REPLACE(t1.Link, '|', ','))
)

I assumed that you want to replace any old values in the Link column with its new value. See the results in action on dbfiddle.uk

If the Link column have only two names always, then we try self joining twice to match the respective new names which should be used for replacement. The join condition is ugly, but this is the price paid for storing denormalized data in your table.

WITH cte AS 
(
    SELECT t1.Link, t2.NewName AS NewNameLeft, t3.NewName AS NewNameRight
    FROM yourTable t1
    LEFT JOIN yourTable t2
        ON SUBSTRING(t1.Link, 1, CHARINDEX('|', t1.Link) - 1) = t2.OldName
    LEFT JOIN yourTable t3
        ON SUBSTRING(t1.Link,
                     CHARINDEX('|', t1.Link) + 1,
                     LEN(t1.Link) - CHARINDEX('|', t1.Link)) = t3.OldName
)
UPDATE cte
SET Link = NewNameLeft + '|' + NewNameRight
WHERE NewNameLeft IS NOT NULL AND NewNameRight IS NOT NULL;

Note that this answer assumes that each old name appears only once in the table. I default to not doing an update unless both left and right new names are found.

I guess you just need REPLACE

select id, NewName, OldName, replace(link, 'OldName', 'NewName') Link
from your_data

and if you need to do it directly in table then use

update your_data
set link = replace(link, 'OldName', 'NewName')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM