Usuwanie podwójnych spacji z tekstu metodami języka SQL

2-kwi-2011

Załóżmy, że w tabeli w danej kolumnie mamy zapisany ciąg znaków, jednak z jakiegoś powodu w tekście pojawiają się podwóje spacje (lub inne podwójne znaki). Jak ich się pozbyć przy pomocy metod dostępnych w języku SQL?
Po kolei. Załóżmy, że tą naszą kolumną jest zmienna @string. Można by próbować oczyścić napis z niepotrzebnych podwójnych spacji z wykorzystaniem funkcji REPLACE. Każemy tej funkcji zamieniać podwójne spacje ’  ’ na pojedyńcze. W ten sposób z np. 4 spacji zrobią się najpier 3, w kolejnym kroku 2, a w ostatnim tylko jedna:

DECLARE @string VARCHAR(100);
SET @string = 'Very   long  string    with  multiple    spaces';
SELECT @string;
SELECT @string = REPLACE(@string, '  ', ' ');
SELECT @string;
SELECT @string = REPLACE(@string, '  ', ' ');
SELECT @string;
SELECT @string = REPLACE(@string, '  ', ' ');
SELECT @string;
SELECT @string = REPLACE(@string, '  ', ' ');
SELECT @string;
GO

Niby dobrze, ale kiedy należy skończyć z takim wywoływaniem procedury? Ano wtedy, gdy w napisie nie ma już podwójnych spacji!
Pisząc pętlę while jesteśmy coraz bliżej dobrego rozwiązania. Warunkiem zakończneia pętli będzie sprawdzenie czy dane zawierają jeszcze jakieś podwójne spacje. Zrobi to funkcja CHARINDEX. Szuka ona wystąpienia określonego znaku/znaków w napisie i zwaraca liczbę będącą pozycją szukanego znaku w kolumnie. Jeżeli funkcja zwraca 0, to znaczy, że w napisie nie ma już podwójnych spacji:

DECLARE @string VARCHAR(100);
SET @string = 'Very   long  string    with  multiple    spaces';
WHILE (CHARINDEX('  ',@string)>0)
 SELECT @string = REPLACE(@string, '  ', ' '); -- zamień 2 spacje na 1
SELECT @string;
GO

Skoro to działa, to jesteśmy już o krok od sukcesu. Napiszmy funkcję, która jako argument przyjmuje napis do oczyszczenia ze spacji, a zwraca napis oczyszczony, z którego usunięto już zdublowane spacje.

CREATE FUNCTION CleanSpaces(@Input VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
 WHILE (CHARINDEX('  ',@Input)>0)
  SELECT @Input = REPLACE(@Input, '  ', ' '); -- zamień 2 spacje na 1

RETURN @Input;
END
GO
DECLARE @string VARCHAR(100);
SET @string = 'Very   long  string    with  multiple    spaces';
SELECT @string,dbo.CleanSpaces(@string)
GO

Uff – spacje wyrzucone, problem rozwiązany. Podwóje spacje zostały usunięte z kolumny. Pora na sztuczkę, która zrobi to jeszcze szybciej!
Załóżmy, że mam napis z 3 spacjami

New   York

Gdyby tak każdą spację zamienić na <> to napis zmieniłby postać na:

New<><><>York

A gdyby tak teraz każdy ciąg znaków >< zamienić na pusty napis:

New<>York

I wreszcie gdyby każdy ciąg znaków <> zamienić na spację to dostałbym:

New York

Zamieniając nasze gdybbanie na język SQL:

DECLARE @string VARCHAR(100);
SET @string = 'New York';
SELECT REPLACE(REPLACE(REPLACE( @string, ' ', '<>'),'><', ''),'<>',' ')

No brawo, bez pisania włsanych funkcji, ale z wykorzystaniem sprytu, można usunąć podwójne spacje wykorzystując SQL.

Źródła:

Komentarze:

  1. Wiesiek napisał,

    Ciekawy wpis, ale chyba mało przydatny od wersji 2012 SQL Servera.

    declare @txt varchar(50) = ’ AAA BB 1CCC DDD E1E FF 2 G HHHH3 ’

    select REPLACE(@txt, ’ ’, ”)

    Jak widać samo repalce wystarczy, na końcu stringa jest znak ltabulacji.

Autor: Rafał Kraik