Получить подстроку в SQL Server

Я хочу получить подстроку в SQL Server из последней последовательности разбиения на точки (.).

У меня есть столбец, который содержит имена файлов, такие как hello.exeи я хочу найти расширение файла точно так же, как Path.GetExtension("filename") делает в C#.

3 ответа

Решение

Ты можешь использовать reverse вместе с substring а также charindex чтобы получить то, что вы ищете:

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

Это работает, даже если у вас есть несколько . в вашем файле (например, hello.world.exe вернусь exe).

Так что я немного поиграл с этим, и это другой способ (только один звонок reverse):

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

Это вычисляет 10 000 000 строк за 25 секунд против 29 секунд для предыдущего метода.

DECLARE @originalstring VARCHAR(100)
SET @originalstring = 'hello.exe'

DECLARE @extension VARCHAR(50)

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

SELECT @extension

Это должно сделать это, я надеюсь! Это работает до тех пор, пока у вас есть только один "." в вашем имени файла - отделяя имя файла от расширения.

Марк

Попробуй это

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

То же, что принятый ответ, но я добавил условие, чтобы избежать ошибки, когда filename равно нулю или когда filename не имеет расширения (нет смысла):

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

Следующий запрос SQL касался большинства крайних случаев в моей странной базе данных, когда многие файлы не имели расширений.

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
Другие вопросы по тегам