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%’