2017-09-15 1 views
1

Ich habe für 2 volle Tage beschäftigt gewesen, eine Lösung für mein Problem zu finden. Ich habe eine große Datenbank und möchte eine Reihe von Zahlen innerhalb einer Spalte ersetzen.SQL Replace feste Länge, verschiedene numerische Werte in der Spalte TEXT

Die Spalte enthält Text und in diesem Text das Format FPC1234567890. Das einzige Ding ist: die Zahlen sind immer unterschiedlich (aber immer 10 in der Länge), die 3 Buchstaben sind immer das selbe.

Ich versuchte dies:

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) 

Dies funktioniert nicht, da die Platzhalter mit der Funktion ersetzen nicht funktionieren, es funktioniert, wenn ich in einer der richtigen Zahlen geben Sie in der Spalte befinden.

finde ich, was ich mit diesen aktualisieren:

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

Markieren Sie die von Ihnen verwendeten dbms. (sql-server vielleicht?) – jarlh

Antwort

0

SQL Server verfügt über eine Funktion PATINDEX, die für ein bestimmtes Muster ähnlich LIKE aussieht. Wenn Ihre text Spalte nur eine Instanz dieses Muster enthalten (nicht mehrere), dann können Sie es wie folgt tun:

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; 

I verwendet CTE und CROSS APPLY um die Abfrage besser lesbar zu machen und zu vermeiden, dass die Ausdrücke wiederholen. Sie können alle diese Ausdrücke in einfache UPDATE setzen.

Ich empfehle, die Abfrage mit unkommentiert SELECT * FROM CTE; Zeile zuerst zu überprüfen, ob das Ergebnis korrekt ist. Höchstwahrscheinlich müssen Sie die Formel anpassen, an einigen Stellen 1 hinzufügen oder abziehen. Sobald Sie bestätigen, dass die Berechnungen korrekt sind, kommentieren Sie SELECT und kommentieren Sie UPDATE Zeile.


Wenn Ihre Textwerte mehrere Instanzen dieses Muster enthalten können, dann können Sie die oben genannten UPDATE mehrmals ausgeführt werden, bis die Werte aufhören zu ändern (Anzahl der betroffenen Zeilen zu Null).

+0

DANKE Vladimir! Nur für mein Verständnis, was macht die '- 13'? (RECHTS (spaltenname_nvarchar, LEN (spaltenname_nvarchar) - idx - 13) – user1654659

+0

@ user1654659, '13' ist die Länge der Zeichenfolge, die Sie ersetzen (' FPC1234567890'). Versuchen Sie, die Abfrage auszuführen und das Ergebnis zu überprüfen um diese Zahl um +1 oder -1 anzupassen. –

Verwandte Themen