Sql 从字符多次存在的字符串中删除特定字符

Sql 从字符多次存在的字符串中删除特定字符,sql,sql-server,string,replace,Sql,Sql Server,String,Replace,我有一个客户参考资料,我们在内部使用它来识别处理某些作业时的客户。它由姓氏、带有连字符而不是空格的邮政编码以及日期格式的出生日期组成,例如: Jonesm1-1BD1978-05-05 我需要将该连字符从邮政编码中删除,因为我们不希望继续使用该连字符,因此需要更正以匹配以这种方式存在的现有数据 我不太明白如何在不影响其他字符/符号的情况下从字符串中取出三个相同字符/符号中的第一个。只需使用CHARINDEX获取第一个连字符的位置,然后用其他东西替换字符: WITH testdata(str) A

我有一个客户参考资料,我们在内部使用它来识别处理某些作业时的客户。它由姓氏、带有连字符而不是空格的邮政编码以及日期格式的出生日期组成,例如:

Jonesm1-1BD1978-05-05 我需要将该连字符从邮政编码中删除,因为我们不希望继续使用该连字符,因此需要更正以匹配以这种方式存在的现有数据

我不太明白如何在不影响其他字符/符号的情况下从字符串中取出三个相同字符/符号中的第一个。

只需使用CHARINDEX获取第一个连字符的位置,然后用其他东西替换字符:

WITH testdata(str) AS (
    SELECT 'JonesM11-1BD1978-05-05'
)
SELECT 
    str, STUFF(str, CHARINDEX('-', str), 1, '') AS str_fixed
FROM testdata
结果:

| str                    | str_fixed             |
|------------------------|-----------------------|
| JonesM11-1BD1978-05-05 | JonesM111BD1978-05-05 |

我喜欢@Salman给出的答案,但这里有一个选择。我们可以试着把第一个连字符的字符串的两半拼凑在一起,这是我们要删除的邮政编码连字符

SELECT
    str,
    LEFT(str, CHARINDEX('-', str) - 1) +
        RIGHT(str, LEN(str) - CHARINDEX('-', str)) AS str_fixed
FROM testdata;

您可以使用STUFF和CHARINDEX来实现您的需求

选择STUFFcol,CHARINDEX'substring',col,LEN'substring',replacement' 临时工


将您的字符串替换为子字符串中的列“-”,并将其替换为空白以获得正确答案。

这一点都没有帮助,但您如何处理在邮政编码之间移动的客户?我想我戴着我对你的数据模型感到好奇/担心的帽子。哦,这是保险,所以一个新的地址/邮政编码意味着它们实际上是分开的。我们在幕后也只是为了一个非常特殊的目的使用这些参考资料,其他业务部门或其他任何事情都不会使用它们。啊,是的,就是这个!我需要阅读更多关于东西和如何使用它的内容,谢谢@salman-a