2017-09-15 112 views
1

我一直忙着满2天发现我的问题的解决方案。我有一个大型数据库,我想替换列中的一组数字。SQL文本列内更换固定的长度,不同的数值

列包含文本和文本中有这种格式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) 

这是不行的,因为通配符不与替换功能的工作,它的工作,当我居住在列的正确号码中的一个类型。

我能找到我所需要的这个更新:

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

标记您正在使用的dbms。 (sql-server也许?) – jarlh

回答

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几次(受影响的行数为零)。

+0

谢谢弗拉基米尔!就我的理解而言,'13'是做什么的? (RIGHT(columnname_nvarchar,LEN(columnname_nvarchar) - IDX - 13) – user1654659

+0

@ user1654659,'13'是要替换的字符串('FPC1234567890')的长度尝试运行查询和检查结果,您可能需要。通过+1或-1调整这个数字。 –