18

I want to get a substring in SQL Server from last sequence of a split on dot (.).

I have a column which contains file names such as hello.exe, and I want to find the extension of the file exactly as Path.GetExtension("filename") does in C#.

5 Answers 5

30

You can use reverse along with substring and charindex to get what you're looking for:

select
    reverse(substring(reverse(filename), 1, 
        charindex('.', reverse(filename))-1)) as FileExt
from
    mytable

This holds up, even if you have multiple . in your file (e.g.-hello.world.exe will return exe).

So I was playing around a bit with this, and this is another way (only one call to reverse):

select 
    SUBSTRING(filename, 
        LEN(filename)-(CHARINDEX('.', reverse(filename))-2), 8000) as FileExt
from
    mytable

This calculates 10,000,000 rows in 25 seconds versus 29 seconds for the former method.

Sign up to request clarification or add additional context in comments.

3 Comments

+1 good call ! I was wondering if there way any easy way to deal with multiple '.' in the file name, without resorting to messy character counting and parsing - well done!
charindex('.', reverse(filename))-1 fails when there is no dot in filename. used charindex('.', reverse(filename))
in Mysql you can use SUBSTRING_INDEX, for example: SUBSTRING_INDEX(file_name, '.', -1), maybe there is something similar to sql-server
2
DECLARE @originalstring VARCHAR(100)
SET @originalstring = 'hello.exe'

DECLARE @extension VARCHAR(50)

SET @extension = SUBSTRING(@originalstring, CHARINDEX('.', @originalstring) + 1, 999)

SELECT @extension

That should do it, I hope! This works as long as you only have a single '.' in your file name - separating the file name from the extension.

Marc

1 Comment

This is a good answer IF you are 100% sure there is only one period (Fullstop) in the originalstring variable. Otherwise, the approved is better.
2

Try this

SELECT RIGHT(
             'C:\SomeRandomFile\Filename.dat',
             CHARINDEX(
                       '.',
                       REVERSE(
                               'C:\SomeRandomFile\Filename.dat'
                              ),
                       0)
              -1)

Comments

1

Same as accepted answer, but I've added a condition to avoid error when filename is null or when filename has no extension (no point):

select
    reverse(substring(reverse(filename), 1, 
        charindex('.', reverse(filename))-1)) as FileExt
from
    mytable
where 
    filename is not null
and charindex('.',filename) > 0

Comments

0

The following SQL request adressed most of the edge cases in my weird database where many files didn't have extensions.

select distinct reverse(left(reverse(fileNameWithExtension), charindex('.', reverse(fileNameWithExtension)) - 1))
from myTable
where charindex('.', reverse(fileNameWithExtension)) - 1 > 0 and charindex('.', reverse(fileNameWithExtension)) - 1 < 7 and fileNameWithExtension is not null

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.