Η SUBSTRING επιστρέφει ένα τμήμα ενός string, ξεκινώντας από τη θέση που της δίνεις και για όσους χαρακτήρες ζητήσεις. Έτσι η SQL βγάζει ένα πρόθεμα, έναν κωδικό ή το domain ενός email από μια στήλη κειμένου. Τα παραδείγματα δουλεύουν σε PostgreSQL, MySQL, SQLite και SQL Server.
Πώς χρησιμοποιείς τη SUBSTRING
Δώσε στη SUBSTRING ένα string, τη θέση από την οποία θα ξεκινήσει (ο πρώτος χαρακτήρας είναι το 1) και πόσους χαρακτήρες θα πάρει. Αν παραλείψεις το μήκος, παίρνει τα πάντα μέχρι το τέλος:
SUBSTRING(string, start, length)
SELECT SUBSTRING('Joe Bloggs', 1, 3);
-- Output: Joe
-- No length: the rest of the string (SQL Server needs all three arguments)
SELECT SUBSTRING('Joe Bloggs', 5);
-- Output: Bloggs
Σε ένα πραγματικό query το string είναι συνήθως μια στήλη. Αριθμοί παραγγελιών όπως ORD-2024-001 έχουν το έτος στους χαρακτήρες 5 έως 8:
-- Input: orders
-- order_number
-- ------------
-- ORD-2024-001
-- ORD-2025-014
-- ORD-2026-102
SELECT order_number, SUBSTRING(order_number, 5, 4) AS year
FROM orders;
-- Output:
-- order_number | year
-- -------------+-----
-- ORD-2024-001 | 2024
-- ORD-2025-014 | 2025
-- ORD-2026-102 | 2026
Κανόνες που πρέπει να ξέρεις
- Οι θέσεις ξεκινούν από το 1, όχι από το 0. Μια αρνητική αρχή μετράει προς τα πίσω από το τέλος του string, αλλά μόνο σε MySQL και SQLite:
SELECT SUBSTRING('Joe Bloggs', -6, 6);
-- Output: Bloggs
-- PostgreSQL and SQL Server return '' (an empty string) instead
- Αν ξεπεράσεις το τέλος, δεν βγαίνει σφάλμα. Παίρνεις τους χαρακτήρες που υπάρχουν ή ένα κενό string όταν η αρχή είναι μετά το τέλος:
SELECT SUBSTRING('Bob', 1, 10);
-- Output: Bob
SELECT SUBSTRING('Hello', 10, 5);
-- Output: '' (an empty string)
- NULL μπαίνει, NULL βγαίνει. Τύλιξε την κλήση σε COALESCE όταν χρειάζεσαι μια τιμή:
SELECT SUBSTRING(NULL, 1, 5);
-- Output: NULL
-- SQL Server rejects a bare NULL here, but a NULL column gives NULL
-
Φίλτραρε με πρόθεμα μέσω LIKE, όχι SUBSTRING. Το
WHERE SUBSTRING(product_code, 1, 3) = 'ELE'επιστρέφει τις ίδιες γραμμές με τοWHERE product_code LIKE 'ELE%', αλλά μόνο η εκδοχή με LIKE μπορεί να χρησιμοποιήσει index στοproduct_code.
Εναλλακτική σύνταξη
Θα δεις επίσης τη SUBSTR, άλλο όνομα για τη SUBSTRING, καθώς και τις LEFT και RIGHT, που παίρνουν χαρακτήρες από τη μία ή την άλλη άκρη:
-- Not in SQL Server
SELECT SUBSTR('Joe Bloggs', 1, 3);
-- Output: Joe
-- Not in SQLite: use SUBSTRING('Joe Bloggs', 1, 3) and SUBSTRING('Joe Bloggs', -6)
SELECT LEFT('Joe Bloggs', 3);
-- Output: Joe
SELECT RIGHT('Joe Bloggs', 6);
-- Output: Bloggs
-- PostgreSQL and MySQL: the standard SQL form
SELECT SUBSTRING('Joe Bloggs' FROM 1 FOR 3);
-- Output: Joe
Για να ξεκινήσεις μετά από έναν συγκεκριμένο χαρακτήρα, βρες πρώτα τη θέση του:
SELECT INSTR('joe@example.com', '@');
-- Output: 4
-- PostgreSQL: POSITION('@' IN 'joe@example.com'); SQL Server: CHARINDEX('@', 'joe@example.com')
Πότε να χρησιμοποιείς τη SUBSTRING;
Χρησιμοποίησε τη SUBSTRING όταν το κομμάτι του string που χρειάζεσαι βρίσκεται σε γνωστή θέση ή αμέσως μετά από έναν χαρακτήρα που μπορείς να εντοπίσεις. Οι περισσότερες χρήσεις ανήκουν σε μία από αυτές τις τέσσερις.
Πάρε τους πρώτους χαρακτήρες
Κωδικοί και ονόματα συχνά έχουν νόημα στην αρχή: την κατηγορία σε έναν κωδικό προϊόντος, ένα αρχικό, μια σύντομη προεπισκόπηση μιας μεγάλης περιγραφής. Το SUBSTRING(column, 1, n) παίρνει τους πρώτους n χαρακτήρες.
Βγάλε πεδία από τιμές σταθερής μορφής
Όταν κάθε τιμή έχει την ίδια διάταξη, κάθε τμήμα βρίσκεται στην ίδια θέση σε κάθε γραμμή: ο κωδικός περιοχής σε έναν αριθμό τηλεφώνου όπως (303) 555-0147, το έτος στο ORD-2024-001 ή τα πεδία μιας εγγραφής σταθερού πλάτους από ένα παλαιότερο σύστημα.
Εξήγαγε κείμενο μετά από διαχωριστικό
Τα domains των email, οι επεκτάσεις αρχείων και τα paths των URL ξεκινούν μετά από έναν χαρακτήρα του οποίου η θέση αλλάζει από γραμμή σε γραμμή. Βρες τη θέση του με την INSTR, ξεκίνα έναν χαρακτήρα μετά και πάρε το υπόλοιπο string.
Κράτα τους τελευταίους χαρακτήρες
Για να κρύψεις έναν αριθμό κάρτας ή λογαριασμού ή να διαβάσεις ένα επίθημα, μετράς προς τα πίσω από το τέλος. Υπολόγισε την αρχή από το μήκος του string ή, σε MySQL και SQLite, χρησιμοποίησε αρνητική αρχή.
Πραγματικά παραδείγματα της SUBSTRING
Μέτρησε προϊόντα ανά κατηγορία από τον κωδικό τους
Οι κωδικοί προϊόντων ξεκινούν με μια κατηγορία τριών γραμμάτων. Κάνε ομαδοποίηση με βάση αυτό το πρόθεμα για να μετρήσεις τα προϊόντα κάθε κατηγορίας:
-- Input: products
-- product_code | name
-- -------------+-----------
-- ELE-1234 | USB-C Hub
-- FUR-0087 | Desk Chair
-- ELE-5521 | Webcam
-- OFF-2210 | Stapler
SELECT SUBSTRING(product_code, 1, 3) AS category, COUNT(*) AS products
FROM products
GROUP BY SUBSTRING(product_code, 1, 3)
ORDER BY category;
-- Output:
-- category | products
-- ---------+---------
-- ELE | 2
-- FUR | 1
-- OFF | 1
Ανάλυσε μια εγγραφή σταθερού πλάτους
Οι εξαγωγές από παλαιότερα συστήματα συχνά τοποθετούν τα πεδία σε σταθερές θέσεις χωρίς διαχωριστικό. Εδώ το όνομα καταλαμβάνει 8 χαρακτήρες (συμπληρωμένους με κενά, που αφαιρεί η TRIM), η ημερομηνία γέννησης τους επόμενους 8 και ο κωδικός πόλης τους τελευταίους 3:
-- Input: legacy_data
-- record
-- -------------------
-- JOHNDOE 19850315NYC
-- MARYLEE 19780912CHI
-- JANEROE 19900722LAX
SELECT
TRIM(SUBSTRING(record, 1, 8)) AS name,
SUBSTRING(record, 9, 8) AS birth_date,
SUBSTRING(record, 17, 3) AS city_code
FROM legacy_data;
-- Output:
-- name | birth_date | city_code
-- --------+------------+----------
-- JOHNDOE | 19850315 | NYC
-- MARYLEE | 19780912 | CHI
-- JANEROE | 19900722 | LAX
Βρες την επέκταση κάθε αρχείου
Βρες την τελεία και πάρε ό,τι ακολουθεί. Η πρόταση WHERE παραλείπει τα αρχεία χωρίς τελεία:
-- Input: documents
-- filename
-- ---------------
-- q3-report.pdf
-- budget.xlsx
-- README
-- team-photo.jpeg
SELECT
filename,
SUBSTRING(filename, INSTR(filename, '.') + 1) AS extension
FROM documents
WHERE INSTR(filename, '.') > 0;
-- Output:
-- filename | extension
-- ----------------+----------
-- q3-report.pdf | pdf
-- budget.xlsx | xlsx
-- team-photo.jpeg | jpeg
Στην PostgreSQL, χρησιμοποίησε POSITION('.' IN filename) αντί για INSTR. Στον SQL Server, χρησιμοποίησε CHARINDEX('.', filename) και πρόσθεσε ένα μήκος, όπως LEN(filename).
Κρύψε έναν αριθμό κάρτας
Δεν έχουν όλοι οι αριθμοί καρτών 16 ψηφία, οπότε μια σταθερή θέση αρχής κόβει τους αριθμούς American Express. Μέτρα καλύτερα προς τα πίσω από το τέλος:
-- Input: payments
-- customer_name | card_number
-- --------------+-----------------
-- Lena Fischer | 4111111111111111
-- Marcus Reid | 5500005555555559
-- Aiko Tanaka | 378282246310005
-- Wrong: position 13 only works for 16-digit cards
SELECT customer_name, '**** ' || SUBSTRING(card_number, 13, 4) AS masked_card
FROM payments;
-- Output:
-- customer_name | masked_card
-- --------------+------------
-- Lena Fischer | **** 1111
-- Marcus Reid | **** 5559
-- Aiko Tanaka | **** 005
-- Right: start 4 characters from the end
SELECT customer_name, '**** ' || SUBSTRING(card_number, LENGTH(card_number) - 3, 4) AS masked_card
FROM payments;
-- Output:
-- customer_name | masked_card
-- --------------+------------
-- Lena Fischer | **** 1111
-- Marcus Reid | **** 5559
-- Aiko Tanaka | **** 0005
Σε MySQL και SQL Server, ένωσε τα strings με CONCAT() αντί για ||. Ο SQL Server χρειάζεται επίσης LEN() αντί για LENGTH().
Περισσότερα για τη SUBSTRING
Σε αυτό το blog:
- Οδηγός για το SQL LIKE: βρες κείμενο που ξεκινά, τελειώνει ή περιέχει ένα μοτίβο
- Οδηγός για το SQL COALESCE: αντικατέστησε τα NULL που αφήνει να περάσουν η SUBSTRING
- Οδηγός για το SQL GROUP BY: ομαδοποίησε και μέτρησε γραμμές με βάση μια τιμή που εξήγαγες
- Οδηγός μορφοποίησης ημερομηνιών στην SQL: μορφοποίησε ημερομηνίες και βγάλε τμήματά τους χωρίς να κόβεις strings
Επίσημη τεκμηρίωση:
Το Beekeeper Studio είναι ένα δωρεάν & open source GUI για βάσεις δεδομένων
Το καλύτερο εργαλείο για SQL queries & επεξεργασία που έχω χρησιμοποιήσει ποτέ. Μου δίνει ό,τι χρειάζομαι για να διαχειρίζομαι τη βάση δεδομένων μου. - ⭐⭐⭐⭐⭐ Mit
Το Beekeeper Studio είναι γρήγορο, εύχρηστο και κατανοητό με την πρώτη ματιά. Υποστηρίζει πάρα πολλές βάσεις δεδομένων και δουλεύει άψογα σε Windows, Mac και Linux.
Τι λένε οι χρήστες για το Beekeeper Studio
"Το Beekeeper Studio αντικατέστησε εντελώς την παλιά μου ροή εργασίας με SQL. Είναι γρήγορο, εύχρηστο και κάνει τη δουλειά με βάσεις δεδομένων ξανά απολαυστική."
"Έχω δοκιμάσει πολλά GUI για βάσεις δεδομένων, αλλά το Beekeeper πετυχαίνει την τέλεια ισορροπία ανάμεσα σε δυνατότητες και απλότητα. Απλώς δουλεύει."