SQL文本列内更换固定的长度,不同的数值
我一直忙着满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]%'
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
几次(受影响的行数为零)。
谢谢弗拉基米尔!就我的理解而言,'13'是做什么的? (RIGHT(columnname_nvarchar,LEN(columnname_nvarchar) - IDX - 13) – user1654659
@ user1654659,'13'是要替换的字符串('FPC1234567890')的长度尝试运行查询和检查结果,您可能需要。通过+1或-1调整这个数字。 –
标记您正在使用的dbms。 (sql-server也许?) – jarlh