SQL替换TEXT列中的固定长度,不同的数值

时间:2017-09-15 07:24:45

标签: sql sql-server replace sql-server-2008-r2 wildcard

我已经忙了整整2天,为我的问题寻找解决方案。我有一个大型数据库,我想替换一列中的一组数字。

该列包含文本,在该文本中,该格式为FPC1234567890。 唯一的事情是:数字总是不同的(但总是10个长度),3个字母总是相同的。

我试过了:

update [tablename] 
SET columnname = 
    CAST(REPLACE(CAST(columnname as NVarchar(4000)), 
    'FPC[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]', 'newclientnumber') AS NText)

这不起作用,因为通配符不能与replace函数一起使用,当我输入一个驻留在列中的正确数字时,它确实有效。

我可以找到我需要更新的内容:

SELECT * FROM Tablename
WHERE columnname LIKE '%FPC[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%'

1 个答案:

答案 0 :(得分:0)

SQL Server有一个函数PATINDEX,用于查找与LIKE类似的给定模式。如果您的text列只能包含此模式的一个实例(不是多个),那么您可以这样做:

WITH
CTE
AS
(
SELECT
    columnname
    ,new_value
FROM
    Tablename
    CROSS APPLY
    (
        SELECT
            CAST(columnname as nvarchar(max)) AS columnname_nvarchar
    ) AS CA1
    CROSS APPLY
    (
        SELECT
            PATINDEX('%FPC[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%', 
                columnname_nvarchar) AS idx
    ) AS CA2
    CROSS APPLY
    (
        SELECT
            CAST(
                LEFT(columnname_nvarchar, idx) + 
                'newclientnumber' + 
                RIGHT(columnname_nvarchar, LEN(columnname_nvarchar) - idx - 13)
            AS ntext) AS new_value
    ) AS CA3
WHERE columnname LIKE '%FPC[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%'
)
--SELECT * FROM CTE;
--UPDATE CTE SET columnname = new_value;

我使用CTE和CROSS APPLY使查询更具可读性,避免重复表达式。您可以将所有这些表达式都放到简单的UPDATE

我建议先使用未注释的SELECT * FROM CTE;行运行查询,以检查结果是否正确。您很可能需要调整公式,在少数地方添加或减少1。确认计算结果正确后,请发表评论SELECT并取消注释UPDATE行。

如果您的文本值可以包含此模式的多个实例,那么您可以多次运行上述UPDATE,直到值停止更改(受影响的行数变为零)。