MC, 12:05 czwartek, 15.11.2012 r.
Ilustracja do artykułu: SQL Server (T-SQL) - Funkcja (UDF) zliczająca wystąpienia danego znaku w stringu

SQL Server (T-SQL) - Funkcja (UDF) zliczająca wystąpienia danego znaku w stringu

Korzystając z SQL Servera mamy do dyspozycji sporo funkcji operujących na tekście (łańcuchach znaków, stringach). Jeśli nasze potrzeby wybiegają poza to co mamy dostępne bezpośrednio, należy sobie radzić korzystając z tych metod, które mamy pod ręką, składając z nich nową funkcję. W ten właśnie sposób spróbujemy napisać funkcje do zliczania konkretnych znaków w tekście, a następnie zliczania słów.

Z czego będziemy korzystać?

Przyszło mi ostatnio stanąć przed problemem zliczenia wystąpień konkretnych znaków w tekście, pełniących funkcję separatorów. Zatem liczba tych znaków określała liczbę elementów. W każdym razie... T-SQL nie daje nam domyślnie takiej funkcji, którą moglibyśmy określić liczbę konkretnych znaków w danym tekście. Z tego powodu spróbujemy napisać własną metodę, wykorzystującą standardową funkcję LEN() zwracającą długość danego ciągu znaków oraz REPLACE(), dzięki której możemy dokonać podmiany pewnych wzorców tekstu na inne.
Dlaczego właśnie te funkcje? Otóż zagadnienie spróbujemy sprowadzić do sytuacji w której porównamy ze sobą dwie długości ciągów: pierwotnego, oraz takiego w którym usuniemy wszystkie interesujące nas znaki. Różnica tych dwóch wartości powinna nam determinować interesującą nas liczbę wystąpień wskazanego znaku.

Jak to będzie wyglądało w kodzie?

Spróbujmy to teraz przełożyć na język T-SQL, chociaż póki co nie tworząc z tego funkcji (UDF - User Definied Function). Spójrzmy na poniższy fragment kodu:
DECLARE @tekst NVARCHAR(max)
SET @tekst = 'Dowolny tekst pełniący rolę przykładu'

SELECT LEN(@tekst) - LEN(REPLACE(@tekst, 'o', ''))
Jak widać, definiujemy tekst wejściowy, a następnie obliczamy różnicę jego długości sprzed, oraz po usunięciu z niego wszystkich liter "o". I tym sposobem uzyskujemy informację o liczbie wystąpień tego znaku w tekście.

To może zróbmy z tego UDF?

W niektórych sytuacjach, wygodnie będzie zapisać sobie tę operację jako funkcję, z której będziemy mogli korzystać w dowolnym momencie. Ja postaram się podać taką funkcję a następnie opatrzyć ją minimalistycznym opisem, dlatego jeśli ktoś chce dowiedzieć się więcej o funkcjach w T-SQL i składni ich tworzenia, to zapraszam na stronę: User Definied Function
Spójrzmy więc na poniższy kod:
CREATE FUNCTION dbo.fn_CountCharacters
(
@text NVARCHAR(max)
@character NCHAR(1)
)
RETURNS INT
AS
BEGIN
RETURN SELECT LEN(@text) - LEN(REPLACE(@text, @character, ''))
END
Widzimy, ze funkcja ta nie jest skomplikowana. Przyjmuje dwa parametry: tekst oraz interesujący nas znak, a następnie zwraca liczbę jego wystąpień, która jest typu INT. Przykładowe wywołanie może wyglądać następująco:
SELECT fn_CountCharacters(KolumnaTekstowa, ';') AS LiczbaSrednikow FROM Tabela

Co ze zliczaniem słów?

Jeśli potrzebujemy zliczyć słowa występujące w danym tekście, to jak nie trudno się domyślić, możemy zliczyć wystąpienia znaków spacji a następnie zwiększyć ją o 1. W ten sposób dowiemy się ile mamy we wskazanej treści ciągów znaków rozdzielonych pojedynczą spacją, co w przypadku poprawnie zapisanego tekstu powinno dać nam w rezultacie liczbę poszczególnych wyrazów.
SELECT fn_CountCharacters(KolumnaTekstowa, ' ') + 1 AS LiczbaSlow FROM Tabela
Z resztą w podobny sposób moglibyśmy podliczyć wszystkie zdania, determinując liczbę kropek w tekście, choć to założenie nie musi być zawsze prawdziwe, zależnie od specyfiki tekstu. Tym niemniej, czasem może się to okazać przydatne:
SELECT fn_CountCharacters(KolumnaTekstowa, '.') + 1 AS LiczbaZdan FROM Tabela

Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!

Imię:
Treść: