首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQL REPLACE,其中被替换的字符串和替换是另一个替换的结果

使用SQL REPLACE,其中被替换的字符串和替换是另一个替换的结果
EN

Stack Overflow用户
提问于 2016-10-12 16:00:33
回答 4查看 160关注 0票数 1

尝试替换我的数据库中的一些字符串,我有两个表。table_2上的替换使用第一次替换的结果作为输入:

当前状态(字符串只是一个替身,它可以是任何东西,重要的部分是破折号):

代码语言:javascript
复制
|table_1 - col1|    |table_2   - col1            |       
----------------    ------------------------------
|string-1      |    |text string-1 text string-3 |     
|string-2      |    |text string-3 string-2 t-ext|
|string-3      |    |string-2 text string-3 te-xt|

期望的结果:

代码语言:javascript
复制
|table_1 - col1 |    |table_2 - col1              |       
-----------------    ------------------------------
|string_1       |    |text string_1 text string_3 |     
|string_2       |    |text string_3 string_2 t-ext|
|string_3       |    |string_2 text string_3 te-xt|

简单地说,我想在table_1中用_替换-,并在table_2上执行相应的替换。

我想出了第一部分,但我想不出table_2上的替换部分:

代码语言:javascript
复制
SELECT col1, REPLACE(col1, '-', '_') as Replacement  
FROM table_1 
where col1 like '%-%'

我需要这样做(这段代码不正确):

代码语言:javascript
复制
SELECT REPLACE(col1, 
    SELECT [col1] FROM [table_1] where col1 like '%-%',
    SELECT REPLACE([col1], '-', '_') FROM [table_1] where col1 like '%-%')      
from table_2
EN

回答 4

Stack Overflow用户

发布于 2016-10-12 16:22:37

不超过2次更换

代码语言:javascript
复制
SELECT t2.col2, REPLACE(REPLACE(t2.col2,t1.col1,REPLACE(t1.col1, '-', '_')),t3.col1,REPLACE(t3.col1, '-', '_')) 
FROM table_2 t2
JOIN table_1 t1 ON t2.col2 like '%' +t1.col1+'%' AND t1.col1 LIKE '%-%'
LEFT JOIN table_1 t3 ON t3.col1 <> t1.col1 AND t2.col2 LIKE '%'+t3.col1+'%' AND t3.col1 LIKE '%-%'
WHERE t2.col2 LIKE '%-%'
票数 1
EN

Stack Overflow用户

发布于 2016-10-12 16:43:19

这是完全即席的,不需要递归:

代码语言:javascript
复制
DECLARE @table_1 TABLE(ID INT IDENTITY,col1 VARCHAR(100));
INSERT INTO @table_1 VALUES    
 ('string-1'),('string-2'),('string-3');

DECLARE @table_2 TABLE(ID INT IDENTITY,col1 VARCHAR(100));
INSERT INTO @table_2 VALUES    
 ('text string-1 text string-3'),('text string-3 string-2 t-ext'),('string-2 text string-3 te-xt');

--第一个CTE替换t1中的值

代码语言:javascript
复制
WITH t1New AS
(
    SELECT ID AS t1_ID
          ,t1.col1 AS t1c1
          ,REPLACE(t1.col1,'-','_') AS new_t1c1 
    FROM @table_1 AS t1
)

--第二个CTE在空格上拆分t2字符串

代码语言:javascript
复制
,t2Splitted AS
(
    SELECT ID
          ,col1 AS t2c1
          ,CAST('<x>' + REPLACE(t2.col1,' ','</x><x>') + '</x>' AS XML) AS Casted
    FROM @table_2 AS t2
)

--此CTE将值映射到拆分的部分

代码语言:javascript
复制
,Mapped AS
(
    SELECT t1New.*
          ,t2Splitted.ID AS t2_ID 
          ,ROW_NUMBER() OVER(PARTITION BY t2Splitted.ID ORDER BY (SELECT NULL)) AS PartIndex
          ,part.value('.','nvarchar(max)') AS Part
    FROM t2Splitted
    CROSS APPLY t2Splitted.Casted.nodes('/x') AS A(part)
    LEFT JOIN t1New ON t1New.t1c1=part.value('.','nvarchar(max)')
)

--如果存在映射,则采用新值,否则采用旧值

代码语言:javascript
复制
,NewValues AS
(
    SELECT *
           ,CASE WHEN t1c1 IS NOT NULL THEN new_t1c1 ELSE Part END AS newValue
    FROM Mapped 
)

--最终的CTE将字符串与原始顺序中的空格重新连接

代码语言:javascript
复制
,Final AS
(
    SELECT nv1.t2_ID
      ,(SELECT ' ' + nv2.newValue
        FROM NewValues AS nv2
        WHERE nv2.t2_ID=nv1.t2_ID
        ORDER BY PartIndex
        FOR XML PATH('')) AS FinalValue
    FROM NewValues AS nv1
    GROUP BY nv1.t2_ID
)

--最后一个值用于更新原始表

代码语言:javascript
复制
UPDATE t2 SET t2.col1=Final.FinalValue
FROM @table_2 AS t2
INNER JOIN Final ON Final.t2_ID=t2.ID

怎么了:更新t1,这是一行代码,去掉FinalValue中的尾随空格:-)

代码语言:javascript
复制
SELECT * FROM @table_2
票数 1
EN

Stack Overflow用户

发布于 2016-10-12 17:13:10

基于变量的替换可以通过替换一个表来完成。

代码语言:javascript
复制
DECLARE @Raw NVARCHAR(MAX) = '...';
SELECT @Raw= REPLACE(@Raw, P, R)
FROM (VALUES ('string-1', 'string_1'),
            ('string-2','string_2'),
            ('string-3','string_3'),
            ('string-4','string_4'),
) AS T(P, R);

要对表执行相同的逻辑,请考虑一些语句,例如

代码语言:javascript
复制
SELECT col1, MultipleReplace(col1, replacement_table(P, R))
FROM some_table

因此,创建一个接受字符串输入和替换表的函数。为了将表传递给函数,我们必须创建一个表类型。

代码语言:javascript
复制
CREATE TYPE dbo.MulReplacements AS TABLE 
(
    Pattern NVARCHAR(MAX) NOT NULL,
    Replacement NVARCHAR(MAX) NOT NULL
)

那么这个函数就是

代码语言:javascript
复制
CREATE FUNCTION dbo.MulReplace(
    @string AS NVARCHAR(MAX),
    @replacements AS dbo.MulReplacements READONLY
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @result AS NVARCHAR(MAX) = @string;

    SELECT @result = REPLACE(@result, R.Pattern, R.Replacement) 
    FROM @replacements AS R;

    RETURN @result;
END

把所有东西放在一起

代码语言:javascript
复制
DECLARE @replacement AS dbo.MulReplacements;

INSERT INTO @replacement
SELECT col1, REPLACE(col1, '-', '_')
FROM (VALUES ('string-1'), ('string-2'), ('string-3')) AS table_1(col1)

SELECT col1, dbo.Mulreplace(col1, @replacement)
FROM (VALUES ('text string-1 text string-3'), ('text string-3 string-2 t-ext'), ('string-2 text string-3 te-xt')) AS table_2(col1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39993456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档