How to substring a MySQL table column

I want to select a field from table and substring it.

For example:

VAN1031 --> 1031

I tried this, but is improper syntax:

SELECT SUBSTR(R.regnumber,3,3) from registration R

How can this be done?

Answers


You don't need the third argument (length) if you want to select all the characters to the right of a specific index:

SELECT SUBSTR(R.regnumber, 4)
FROM registration AS R

I also changed the start index to 4 because in SQL strings are 1-indexed and not 0-indexed as they are in many popular programming languages.


You can use:

SUBSTR(string,position)
SUBSTR(string,position,length)
SUBSTRING_INDEX(string, delimiter, count)

Examples:

command                                      prints
-------------------------------------------  -----------
select substr("abcd", 1, 1)                  #a
select substr("abcd", 1, 2)                  #ab
select substr("abcd", 2, 1)                  #b
select substr("abcd", 2, 2)                  #bc
select substr("abcd", -2, 1)                 #c
select substr("abcd", -2, 2)                 #cd

select substring_index('ababab', 'b', 1);    #a
select substring_index('ababab', 'b', 2);    #aba
select substring_index('ababab', 'b', 3);    #ababa
select substring_index('ababab', 'b', -1);   #
select substring_index('ababab', 'b', -2);   #ab
select substring_index('ababab', 'b', -3);   #abab

select substr("abcd", 2)                     #bcd
select substr("abcd", 3)                     #cd
select substr("abcd", 4)                     #d
select substr("abcd", -2)                    #cd
select substr("abcd", -3)                    #bcd
select substr("abcd", -4)                    #abcd

From this link.


You can use SUBSTRING():

select substring(col1, 4)
from table1

See SQL Fiddle with Demo. So your query would be:

SELECT substring(R.regnumber,4) 
from registration R

Of if you want to specify the number of characters to return:

select substring(col1, 4, 4)
from table1

I noticed that mysql index starts from 1 instead of zero as many programming languages did.

SELECT SUBSTRING(R.regNumber,1,3) FROM registration AS R

Returns VAN and

SELECT SUBSTRING(R.regNumber,4) FROM registration AS R

Returns the remaining part of the string as 1031


SELECT substring(R.regnumber FROM 4) FROM registration AS R;

and if you want to take the part as an integer not a string you can write:

SELECT CAST(substring(R.regnumber FROM 4) AS UNSIGNED) FROM registration as R;

Sometimes you need to catch the column without some last characters. For example, I have:

This is a string

Let's say that for some reason I want column without last 6 characters:

This is a 

We can do (using @bluefeet 's answer and LENGHT):

select substring(col1, 1,LENGTH(col1)-7)
from table1

It was only an example, but you got the idea, I'm using to fix a wrong database import.


Need Your Help

In Rails 3's "bundle install" of local gem (frozen gem), keep getting "Source does not contain any versions of ..."?

ruby-on-rails ruby-on-rails-3 gem bundler gemspecs

I am using a gem which is in vendor/gems/some-api-0.1.0, copied over from another project, and added to Gemfile:

grid.arrange from gridExtras exiting with "only 'grobs' allowed in 'gList'" after update

r ggplot2 gridextra r-grid

I just updated R, R Studio, and a bunch of packages including ggplot2 and gridExtras on my Mac. Now gridExtras is failing in basic plotting with the error: