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:

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:

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.

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

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

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

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

Zamieniając nasze gdybbanie na język SQL:

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.

Dodaj komentarz:

Autor: Rafał Kraik