簡體   English   中英

從另一列替換匹配的行字符串

[英]Replace Matching Row String From Another Column

我有這張桌子:

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

我想要發生的是將“ Link列上的所有OldName更改為NewName 像這樣:

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

誰能建議最好的方法是什么?

您正在尋找將“舊名稱”鏈接的值更改為“新名稱”:

首先,您將需要分割由|分隔的Link數據| 排成一行然后與您的表聯接

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;

結果:

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

MSSQL:要將定界值從其他列/其他源存儲到特定行,可以使用FOR XML PATH ,請看以下SO線程

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

MYSQL:如果要將定界值從其他列/其他源存儲到特定行,則可以使用mysql GROUP_CONCAT函數:

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

我假設您想用其新值替換“鏈接”列中的所有舊值。 dbfiddle.uk上查看實際結果

如果“ Link列始終只有兩個名稱,則我們嘗試兩次自我連接以匹配應用於替換的相應新名稱。 連接條件很丑陋,但這是為在表中存儲非規范化數據而付出的代價。

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;

請注意,此答案假定每個舊名稱在表中僅出現一次。 我默認不進行更新,除非找到左右兩個新名稱。

我想你只需要REPLACE

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

如果您需要直接在表格中進行操作,請使用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM