SQL – PRACA ZE STRINGAMI

Business Case:

Napisać program, który będzie wyłuskiwał kwotę z komentarzy jak poniżej:

„wplaci 03.04 500, i potem raty po ok 1 tys od 10.04 , wynagrodz na 10km , problemy ze splata”

Kwota jaką musimy wyciągnąć to 500 – z kolumny comment

case when comment like '%00%' then

NULLIF(

regexp_replace(

substring(comment, position('00' in comment)-2,

5),

'\D','','g'),

'')::numeric end as kwota

Jak widać, kod jest dość skomplikowany 😊

Zaczynamy analizę oczywiście od najbardziej zagnieżdżonej funkcji do najbardziej zewnętrznej:

  • Funkcja POSITION zwraca pozycję znaku lub ciągu znaków w stringu. W naszym przykładzie zwraca pozycję interesującego nas znaku – ‘00’ jest to 14. pozycja
  • SUBSTRING – najpopularniejsza funkcja operująca na tekście – zwraca ciąg danej ilości znaków od danej pozycji. W naszym przypadku zwraca 5 znaków począwszy od 12. pozycji ( w tym zastosowaniu zastosowaliśmy od 12 pozycji aby móc wyciągać też kwoty takie jak 1000). Rezultat funkcji: ‘ 500z’
  • REGEXP_REPLACE – REGEXP_REPLACE(‘ 500z’, ‘\D’, ‘’, ‘g’) – zamienia każdy (‘g’) znak nie cyfrowy (‘\D’) na wartość pustą (‘’), czyli defacto usuwa. Rezultat funkcji – ‘500’
  • NULLIF – zwraca wartość NULL jeśli wyrażenie jest puste (‘’)
  • Na koniec następuje zamiana na wartość liczbową.

Inne popularne funkcje tekstowe:

  • UPPER – zamiana „wyrazu” w „WYRAZ”
  • LOWER – zamiana „Wyrazu” w „wyraz”
  • PROPER – zamiana wyrazu w „Wyraz”
  • TRIM – usuwanie spacji, tabulatorów, przejść do nowej linii występujących na początku lub końcu stringa
  • CONCAT – łączenie stringów – CONCAT(‘Dawid’,’ ‘, ‘Brejecki’) = ‘Dawid Brejecki’ . Zamiast tej funkcji można też po prostu napisać: ‘Dawid’ || ‘ ‘ || ‘Brejecki’
  • REPLACE – proste zamienianie znaków – REPLACE(string,wartosc_zmieniana, nowa_wartosc)
  • SPLIT_PART – bardzo użyteczna funkcja do rozdzielania kolumny tekstowej wg delimitera i zwracania n-tego ciągu znaków: SPLIT_PART(‘Dawid_Brejecki’,’_’,2) zwróci string ‘’Brejecki’
  • FORMAT – zmiana formatu np. FORMAT(‘0.99’, „Percent”) = ’99.00%’