我已经忙了整整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]%'
答案 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
,直到值停止更改(受影响的行数变为零)。