2009-08-04 2 views
15

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

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

ответ

29

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

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

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

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

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

Это вычисляет 10000000 строки в 25 секунд против 29 секунд для первого способа.

+1

+1 хороший звонок! Мне было интересно, есть ли какой-нибудь простой способ справиться с несколькими ». в имени файла, не прибегая к грязному подсчету персонажа и синтаксическому анализу - молодец! –

+1

charindex ('.', Reverse (filename)) - 1 не выполняется, если в имени файла нет точки. используется charindex ('.', reverse (filename)) – Rajesh

+1

в Mysql вы можете использовать SUBSTRING_INDEX, например: SUBSTRING_INDEX (имя_файла, '.', -1), возможно, что-то похожее на 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 

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

Marc

+1

Это хороший ответ, если вы 100% уверены, что есть только один период (Fullstop) в переменной originalstring. В противном случае одобренный лучше. – Phil

2

Попробуйте

SELECT RIGHT(
      'C:\SomeRandomFile\Filename.dat', 
      CHARINDEX(
         '.', 
         REVERSE(
           'C:\SomeRandomFile\Filename.dat' 
          ), 
         0) 
       -1) 
Смежные вопросы