In this tutorial, we will learn about the MySQL SUBSTRING_INDEX()
function. SUBSTRING_INDEX()
is a string function that is used to return the substring of a string before a specific number of occurrences of a given delimiter.
For instance, you have the following string value – “192.168.1.10”.
Now if you specify the delimiter as ‘.’ and its number of occurrences and 2 then the SUBSTRING_INDEX()
function will return “192.168” as our result.
So we are extracting the substring from the string until the second occurrence of the ‘.’ delimiter. SUBSTRING_INDEX()
is usually used with the SELECT
statement.
Syntax of MySQL SUBSTRING_INDEX()
SUBSTRING_INDEX(string, delimiter, number);
Code language: SQL (Structured Query Language) (sql)
Where:
- ‘string’ is the string from which you wish to extract the substring,
- ‘delimiter’ is the delimiter to search for and,
- ‘number’ is the number of occurrences of the delimiter.
Note:
- All the above parameters are required parameters.
- The ‘number’ parameter can have positive and negative integers as values. If the value is a positive integer, then the number of delimiter occurrences are searched from the left side. If the value is a negative integer, then the number of delimiter occurrences are searched from the right side.
Examples of MySQL SUBSTRING_INDEX()
Let us look at a few basic queries demonstrating the MySQL SUBSTRING_INDEX()
function. We will use aliases in the queries to make our output readable. Consider the below queries:
SELECT SUBSTRING_INDEX(‘support@helpdesk.com’, ‘@’, 1) AS Result;
SELECT SUBSTRING_INDEX(‘support@helpdesk.com’, ‘@’, 2) AS Result;
SELECT SUBSTRING_INDEX(‘www.yahoo.co.in’, ‘.’, 3) AS Result;
Code language: SQL (Structured Query Language) (sql)
- In the first query, we want the substring to be till the first occurrence of the delimiter ‘@’.
- In the second query, we want the substring to be till the second occurrence of the delimiter ‘@’.
- And, in the third query, we want the substring to be till the third occurrence of the delimiter ‘.’.
The output is as follows,
MySQL SUBSTRING_INDEX() With Negative Values for Number of Delimiters
As I mentioned earlier while discussing the syntax, we can use negative integers as the value in the ‘number’ parameter. A negative integer indicates counting the number of occurrences of the delimiter from the right side. Let us see a couple of examples of this.
Consider the below queries.
SELECT SUBSTRING_INDEX('www.yahoo.co.in', '.', -1) AS Result;
SELECT SUBSTRING_INDEX('www.yahoo.co.in', '.', -3) AS Result;
Code language: SQL (Structured Query Language) (sql)
And the output is,
Working with Table Data
Let us look at a few examples of tables. Consider the below Employee table.
Simple Example With Table Data
How about finding the joining year of every employee from the Date_Joined column using MySQL SUBSTRING_INDEX()
?
SELECT eid, Name, SUBSTRING_INDEX(Date_Joined, ‘-’, 1) AS JoiningYear FROM Employee;
Code language: SQL (Structured Query Language) (sql)
And the output is,
Nested SUBSTRING_INDEX() Functions
Now, let us find the joining month of every employee from the Date_Joined column using SUBSTRING_INDEX()
.
SELECT eid, Name, SUBSTRING_INDEX(SUBSTRING_INDEX(Date_Joined, ‘-’, 2), ‘-’, -1) AS JoiningMonth FROM Employee;
Code language: SQL (Structured Query Language) (sql)
The inner MySQL SUBSTRING_INDEX()
function will extract the year and month values. The outer SUBSTRING_INDEX()
function has a negative one value as the ‘number’ parameter. Hence, it will extract the substring from the right side till the first occurrence of ‘-’ delimiter.
And our output is,
Nested SUBSTRING_INDEX() Functions with different delimiters
Now how about using a similar logic and displaying which email service every employee uses? Note that only the email service website name should be displayed, the ‘.com’ part should not be in the result. So, our query is,
SELECT eid, Name, SUBSTRING_INDEX(SUBSTRING_INDEX(Email, ‘@’, -1), ‘.’, 1) AS EmailServiceUsed FROM Employee;
Code language: SQL (Structured Query Language) (sql)
The inner SUBSTRING_INDEX()
function will extract the domain part from the email address. This part will contain the website name as well as the ‘.com’ part. But since we do not want the ‘.com’ part in our result-set, we use the outer SUBSTRING_INDEX()
function to get the website name.
Our output is,
Conclusion
SUBSTRING_INDEX()
function is a very powerful function in MySQL and one you would find using often. I would highly recommend that you practice more examples of it by playing around with it!
References
- MySQL Official Documentation on
SUBSTRING_INDEX()
.