Bereinigen einer Zeichenkette auf alphanumerische Zeichen via SQL
Heute stand ich vor der Problematik einen String welcher nicht-alphanumerische Zeichen beinhalten könnte auf eine alphanumerische Version “zusammenzuschrumpfen”.
Eine Suche bei google lieferte viele Ergebnisse, aber nicht alle halte ich für wirklich sinnvoll bzw. gut gelöst, sicher liefern sie ein Ergebnis – aber warum soll ich zum Lösen dieses Problems eine Tabelle anlegen – wie z.B. hier: Strim Strips Out Non-Alphanumeric Characters oder hier: Sql Server Tips – Removing or Replacing non-alphanumeric characters in strings beschrieben.
Eine tolle Lösung habe ich dann aber doch noch gefunden und zwar in einem Oracle-Forum *hüstel* RE: Remove non-numeric characters.
Das Ganze in eine StoredProcedure eingebaut könnte dann z.B. so aussehen:
CREATE PROCEDURE SetCompactArticleNumberOnArticle
AS
BEGIN
DECLARE CompactArticleNumberCursor CURSOR FOR
SELECT [GUID]
, VersionNo
, ArticleNumber
FROM dbo.Article
WHERE CompactArticleNumber IS NULL
DECLARE @GUID UNIQUEIDENTIFIER
DECLARE @VersionNo INT
DECLARE @ArticleNumber NVARCHAR(22)
DECLARE @CompactArticleNumber NVARCHAR(22)
DECLARE @Position INT
OPEN CompactArticleNumberCursor
FETCH NEXT FROM CompactArticleNumberCursor into @GUID ,@VersionNo , @ArticleNumber
WHILE @@FETCH_STATUS = 0
BEGIN
SET @CompactArticleNumber = @ArticleNumber;
SELECT @Position = PATINDEX('%[^0-9a-Z]%', @CompactArticleNumber);
WHILE @Position > 0
BEGIN
SELECT @CompactArticleNumber = STUFF(@CompactArticleNumber, @Position, 1, '');
SELECT @Position = PATINDEX('%[^0-9a-Z]%', @CompactArticleNumber);
END;
UPDATE Article
SET CompactArticleNumber = @CompactArticleNumber
WHERE [GUID] = @GUID AND VersionNo = @VersionNo;
FETCH NEXT FROM CompactArticleNumberCursor into @GUID ,@VersionNo , @ArticleNumber
END;
CLOSE CompactArticleNumberCursor
DEALLOCATE CompactArticleNumberCursor
END;
GO
Diese StoredProcedure konvertiert, wann immer sie ausgeführt wird, ArtikelNummern in eine alphanumerische Version dieser. Schlüssel dazu sind die beiden T-SQL Funktionen STUFF und PATINDEX.
Wobei STUFF zum Entfernen der nicht-alphnumerischen Zeichen an einer Position verwendet wird und PATINDEX zum Auffinden der nächsten Position eine solchen Zeichens. Einfach aber effektiv und ganz ohne zusätzliche Tabelle. Sehr schön!