SQL查询:更新列中与另一列值匹配的子字符串

SQL查询:更新列中与另一列值匹配的子字符串,sql,sql-server,Sql,Sql Server,我有一个地址列,在邮政编码中有值+。但是+可以在列中的任何位置(街道名称、城市),但我只需要用另一个名为邮政编码的列标识地址中的邮政编码,然后删除+ 在邮政编码和密码中识别+将是一个困难的sql查询 移除但不知道怎么做 我已经从邮政编码列中删除了+ 表格示例 POSTAL_CODE FORMATTED_ADDRESS T2E 8N6 #6, 1435-40th Ave NE #6 Calgary AB T2E+8N6 Canada 234

我有一个地址列,在邮政编码中有值
+
。但是+可以在列中的任何位置(街道名称、城市),但我只需要用另一个名为
邮政编码的列标识地址中的邮政编码,然后删除
+

在邮政编码和密码中识别
+
将是一个困难的sql查询 移除但不知道怎么做

我已经从
邮政编码
列中删除了
+

表格示例

POSTAL_CODE             FORMATTED_ADDRESS
T2E 8N6                 #6, 1435-40th Ave NE #6 Calgary AB  T2E+8N6 Canada
23401                   9 Abolaji Street Mafoluku +23401 Oshodi Lagos State Nigeria
234-01                  6 Force Road, Square Race Course +234-01 Lagos, Nigeria Lagos State
86 163453               Daqing Oilfield Co.Ltd Ranghulu 86+163453 Daqing CHN

这可以通过一些
REPLACE
语句来完成:

UPDATE YourTable
SET FORMATTED_ADDRESS = REPLACE(
        REPLACE(FORMATTED_ADDRESS, REPLACE(POSTAL_CODE, ' ', '+'), POSTAL_CODE), 
        '+'+POSTAL_CODE, 
        POSTAL_CODE)
FROM YourTable
您可以通过
先选择
ing来测试此查询的结果:

SELECT REPLACE(
        REPLACE(FORMATTED_ADDRESS, REPLACE(POSTAL_CODE, ' ', '+'), POSTAL_CODE), 
        '+'+POSTAL_CODE, 
        POSTAL_CODE) AS NEW_FORMATTED_ADDRESS,
        FORMATTED_ADDRESS
FROM YourTable

这在MS SQL Server中似乎很难做到。
(使用regexp_replace函数将更容易实现…)

无论如何

示例代码段:

declare @YourTable table (POSTAL_CODE varchar(30), FORMATTED_ADDRESS varchar(1000));

insert into @YourTable (POSTAL_CODE, FORMATTED_ADDRESS) values
('T2E 8N6','#6, 1435-40th Ave NE #6 Calgary AB  T2E+8N6 Canada'),
('23401', '9 Abolaji Street Mafoluku +23401 Oshodi Lagos State Nigeria'),
('234-01', '6 Force Road, Square Race Course +234-01 Lagos, Nigeria Lagos State'),
('86 163453', 'Daqing Oilfield Co.Ltd Ranghulu 86+163453 Daqing CHN'),
(NULL, 'foo +1234 bar'),
('12345', 'bar 12345+ baz');

UPDATE @YourTable
SET FORMATTED_ADDRESS = 
    REPLACE(
       REPLACE(
          REPLACE(FORMATTED_ADDRESS, 
             '+'+POSTAL_CODE, POSTAL_CODE),
             POSTAL_CODE+'+', POSTAL_CODE),
             REPLACE(POSTAL_CODE,' ','+'), POSTAL_CODE)
WHERE POSTAL_CODE IS NOT NULL
AND (
     FORMATTED_ADDRESS LIKE CONCAT('%+', POSTAL_CODE, '%') OR
     FORMATTED_ADDRESS LIKE CONCAT('%', POSTAL_CODE, '+%') OR
     (POSTAL_CODE LIKE '%[ ]%' AND FORMATTED_ADDRESS LIKE CONCAT('%', REPLACE(POSTAL_CODE,' ','+'), '%'))
);


SELECT * FROM @YourTable;

您是否正在查找使用以下内容选择的更新行:
select*从我的\u表中,其中格式化的\u地址(如“%++”+邮政编码+”%
)?是否要更新格式化的\u地址,并删除那些位于匹配邮政编码前面的
+
?或者不使用
+
?@LukStorms update formatted\u address来选择它们。如何检查此查询以查看是否有任何中断。?检查编辑,您可以看到
更新
将做什么。您的代码工作得非常好。只有一种情况是,当
Mafoluku 23401+Oshodi
时,它不工作。前
+
工作,但后
+
不工作,如果您的更新状态设置为
NULL
,如果邮政编码为null@James123不再选择空邮政编码。现在在它后面加上+。@James123它被简化了。