Analizowanie i formatowanie ciągów znaków
SUBSTRING, pozycje, dzielenie i zmiana wielkości liter w różnych dialektach.
Analizowanie i formatowanie ciągów znaków to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Dlaczego pojawiają się pytania o funkcje tekstowe
Rzeczywiste dane są nieuporządkowane: pełne nazwiska trzeba dzielić, z adresów e-mail wyodrębniać domeny, kody bywają osadzone w identyfikatorach, a wielkość liter jest niespójna. Osoby prowadzące rozmowy kwalifikacyjne wykorzystują operacje na tekstach, aby sprawdzić, czy potrafią Państwo oczyścić i przekształcić tekst bez eksportowania go do skryptu.
Podobnie jak w przypadku dat, funkcje te są tylko częściowo ustandaryzowane, więc celem jest znajomość koncepcji i popularnych wariantów.
- Wyodrębnianie podciągów i wyszukiwanie pozycji
- Łączenie tekstów
- Dzielenie i zastępowanie
- Zmiana wielkości liter i usuwanie zbędnych znaków
SUBSTRING i wyszukiwanie pozycji
SUBSTRING(s FROM start FOR length) to forma zgodna ze standardem SQL; większość silników akceptuje również SUBSTRING(s, start, length). Pozycje w tekście są liczone od 1, co jest klasyczną pułapką typu off-by-one dla programistów przyzwyczajonych do języków, w których indeksowanie zaczyna się od 0.
POSITION(sub IN s) (lub STRPOS/CHARINDEX) znajduje pozycję początku podciągu, zwracając 0, jeśli go nie znaleziono.
SELECT
SUBSTRING('INV-2024-042' FROM 5 FOR 4) AS year, -- '2024'
POSITION('-' IN 'INV-2024-042') AS first_dash; -- 4Wyodrębnianie domeny adresu e-mail
To klasyczny przykład. Należy znaleźć znak @, a następnie pobrać wszystko, co znajduje się za nim. Połączenie POSITION z SUBSTRING to przenośne rozwiązanie.
W PostgreSQL można również użyć funkcji SPLIT_PART(email, '@', 2), która jest czytelniejsza i warto wspomnieć o niej jako o idiomatycznym rozwiązaniu.
-- Portable
SELECT SUBSTRING(email FROM POSITION('@' IN email) + 1) AS domain
FROM users;
-- Postgres idiom
SELECT SPLIT_PART(email, '@', 2) AS domain FROM users;Łączenie tekstów w różnych dialektach
Łączenie tekstów zależy od dialektu, a osoby prowadzące rozmowy kwalifikacyjne oczekują znajomości tych wariantów.
- Standard SQL / Postgres / Oracle: operator
||. - MySQL:
CONCAT(a, b, c)(operator||domyślnie oznacza logiczne LUB). - SQL Server: operator
+dla tekstów lub funkcjaCONCAT().
Funkcja CONCAT() traktuje NULL jak pusty tekst, natomiast || i + zazwyczaj powodują, że cały wynik staje się NULL, jeśli którykolwiek operand ma wartość NULL. To subtelne źródło błędów.
-- Postgres
SELECT first_name || ' ' || last_name AS full_name FROM people;
-- MySQL / SQL Server
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM people;Pułapka konkatenacji wartości NULL
Kontynuując poprzedni przykład: jeśli last_name ma wartość NULL, wyrażenie first_name || ' ' || last_name w Postgresie zwróci NULL, usuwając całe imię i nazwisko.
Rozwiązaniem zabezpieczającym jest użycie COALESCE dla elementów, które mogą mieć wartość NULL, albo funkcji CONCAT_WS (łączenie z separatorem), która pomija wartości NULL i wstawia separator tylko między obecne wartości.
-- Safe in Postgres / MySQL
SELECT CONCAT_WS(' ', first_name, last_name) AS full_name FROM people;
-- Or guard each part
SELECT first_name || ' ' || COALESCE(last_name, '') FROM people;Dzielenie tekstów
Pytanie „wyodrębnij trzeci segment z kodu rozdzielanego myślnikami” sprawdza umiejętność dzielenia tekstu. Funkcja PostgreSQL SPLIT_PART(s, delim, n) bezpośrednio zwraca n-ty fragment i jest najczytelniejszym narzędziem.
MySQL nie ma bezpośredniej funkcji dzielenia; stosuje się zagnieżdżone wywołania SUBSTRING_INDEX: najpierw pobiera się pierwszych n fragmentów, a następnie ostatni z nich.
-- Postgres
SELECT SPLIT_PART('a-b-c-d', '-', 3); -- 'c'
-- MySQL: third part of a-b-c-d
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a-b-c-d', '-', 3), '-', -1); -- 'c'Zastępowanie, usuwanie zbędnych znaków i dopełnianie
Operacje czyszczenia danych, które osoby prowadzące rozmowy kwalifikacyjne oczekują znać od ręki:
REPLACE(s, from, to)zastępuje wszystkie wystąpienia.TRIM(s)usuwa spacje z początku i końca;TRIM(BOTH 'x' FROM s)usuwa określony znak.LPAD(s, len, ch)/RPADdopełniają tekst do stałej szerokości, co przydaje się przy uzupełnianiu identyfikatorów zerami.
SELECT
REPLACE('555.123.4567', '.', '-') AS phone, -- 555-123-4567
TRIM(' hello ') AS clean, -- 'hello'
LPAD('42', 6, '0') AS padded; -- '000042'Zmiana wielkości liter i długość tekstu
Normalizacja wielkości liter jest niezbędna przed porównywaniem lub grupowaniem tekstu. Funkcje UPPER i LOWER są uniwersalne; INITCAP (Postgres/Oracle) zapisuje każde słowo z wielkiej litery.
LENGTH(s) w większości silników zwraca liczbę znaków, ale należy uważać: SQL Server używa LEN(), a w niektórych konfiguracjach LENGTH liczy bajty dla tekstu wielobajtowego. Warto wspomnieć o tym niuansie w przypadku danych zawierających znaki spoza ASCII.
SELECT
LOWER(email) AS email_norm,
INITCAP(city) AS city_pretty, -- Postgres
LENGTH(description) AS chars
FROM places;Dopasowywanie wzorców poza LIKE
Gdy LIKE nie jest wystarczająco elastyczne, osoby prowadzące rozmowy kwalifikacyjne chętnie sprawdzają znajomość wyrażeń regularnych. PostgreSQL udostępnia operator ~ oraz funkcje REGEXP_REPLACE / REGEXP_MATCHES; MySQL ma funkcje REGEXP / REGEXP_SUBSTR.
Przykład: pozostawienie wyłącznie cyfr w tekście numeru telefonu. Wyrażenie regularne pozwala zrobić to w jednym wierszu zamiast za pomocą całego łańcucha wywołań REPLACE.
-- Postgres: strip non-digits
SELECT REGEXP_REPLACE('(555) 123-4567', '[^0-9]', '', 'g')
AS digits; -- '5551234567'Głębszy przykład: normalizacja nazw i usuwanie duplikatów
To zadanie łączy kilka operacji czyszczenia. Załóżmy, że nazwiska zawierają zbędne spacje i mają różną wielkość liter, co powoduje powstawanie pozornych duplikatów. Najpierw należy je znormalizować, a dopiero potem grupować.
Przed zliczeniem unikatowych wartości należy usunąć zbędne spacje, zredukować wewnętrzne wielokrotne spacje za pomocą wyrażenia regularnego i zamienić tekst na małe litery. To dokładnie taki wieloetapowy sposób rozumowania, który jest wysoko oceniany podczas rozmów kwalifikacyjnych.
SELECT
LOWER(REGEXP_REPLACE(TRIM(name), '\s+', ' ', 'g')) AS norm_name,
COUNT(*) AS occurrences
FROM contacts
GROUP BY 1
ORDER BY occurrences DESC;Rzutowanie tekstów na liczby i daty
Kolumny tekstowe często zawierają wartości, które powinny być liczbami lub datami. CAST(s AS INTEGER) albo skrócona składnia Postgresa s::int wykonuje konwersję, ale kończy się błędem dla niepoprawnych danych wejściowych.
W przypadku dat funkcja TO_DATE(s, 'YYYY-MM-DD') (Postgres/Oracle) analizuje tekst z użyciem jawnego wzorca formatu. To najbezpieczniejsze podejście, ponieważ usuwa niejednoznaczność kolejności dnia i miesiąca.
SELECT
CAST(qty_text AS INTEGER) AS qty,
TO_DATE(order_str, 'DD/MM/YYYY') AS order_date
FROM staging;Szybkie sprawdzenie
Proszę przeanalizować zachowanie wartości NULL podczas łączenia tekstów.
Podsumowanie: analizowanie i formatowanie tekstów
Najważniejsze informacje, które warto zapamiętać przed rozmową kwalifikacyjną:
- Pozycje w tekście są liczone od 1; funkcje
SUBSTRING+POSITIONwyodrębniają fragmenty na podstawie pozycji. - Teksty należy łączyć za pomocą
||(Postgres),CONCAT(MySQL) lub+(SQL Server), pamiętając o propagacji wartości NULL; warto preferowaćCONCAT_WS. - Teksty należy dzielić za pomocą
SPLIT_PART(Postgres) lub zagnieżdżonych wywołańSUBSTRING_INDEX(MySQL). - Funkcje
REPLACE,TRIM,LPAD,UPPER/LOWERsłużą do czyszczenia i normalizacji; wyrażenia regularne obsługują trudniejsze przypadki. - Wielkość liter i odstępy należy znormalizować przed grupowaniem, aby uniknąć pozornych duplikatów.
Często zadawane pytania
Czy lekcja „Analizowanie i formatowanie ciągów znaków” jest bezpłatna?
Tak — pełny tekst „Analizowanie i formatowanie ciągów znaków” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „Analizowanie i formatowanie ciągów znaków”?
SUBSTRING, pozycje, dzielenie i zmiana wielkości liter w różnych dialektach. Ćwiczysz Coding Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Coding Interview Prep?
Nie wymagamy żadnego doświadczenia. Coding Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Analizowanie i formatowanie ciągów znaków”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Coding Interview Prep?
Tak. Każda lekcja Coding Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Działania na datach i interwały
- Obcinanie i grupowanie dat
- Analizowanie i formatowanie ciągów znaków
- Strefy czasowe i znaczniki czasu