Получить подстроку в 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