Ответ 1
SELECT CASE
WHEN filepath LIKE '%.%' THEN RIGHT(filepath, Len(filepath) -
Charindex('.', filepath))
ELSE filepath
END FilePath
FROM tbl1
У меня есть таблица со столбцом, содержащим полное имя файла, данные выглядят так:
FilePath FileSize
------------------------------ --------
dsch2_chs_wyj.rar 694KB
AllInOneHash.rar 19KB
FilePropertyModifier.rar 12KB
jquery_1_7_api_chm_chs.rar 285KB
startupmgr.rar 38KB
JQueryTableExample_Edi.rar 33KB
hdpartioncalc_csharp.rar 49KB
XMLMenuTest.zip 3KB
Теперь я хочу извлечь имя расширения файла, например .rar
, и вставить в новую таблицу.
INSERT INTO Attachment
(
Id,
[FileName],
ExtensionName,
StoredPath,
CreateOn,
UploaderIP,
DataBinary
)
SELECT ba.Id,
ba.Title,
'{Extension Name}',
ba.FilePath,
GETDATE(),
NULL,
NULL
FROM BlogAttachment ba
Но T-SQL не имеет функции LastIndexOf()
. Как я могу отрезать подстроку простым способом?
SELECT CASE
WHEN filepath LIKE '%.%' THEN RIGHT(filepath, Len(filepath) -
Charindex('.', filepath))
ELSE filepath
END FilePath
FROM tbl1
Вы можете получить расширение, выполнив следующие действия:
select reverse(left(reverse(FilePath), charindex('.', reverse(FilePath)) - 1))
Однако я бы рекомендовал вам сначала проверить, есть ли '.'
в имени:
select (case when FilePath like '%.%'
then reverse(left(reverse(FilePath), charindex('.', reverse(FilePath)) - 1))
else ''
end) as Extension
При поиске конкретных расширений и работе с текстами, имеющими много точек, ниже приведен более конкретный подход.
with extensionTable ([extension]) AS
(
SELECT '.pdf'
UNION ALL SELECT '.txt'
UNION ALL SELECT '.doc'
UNION ALL SELECT '.docx'
UNION ALL SELECT '.xls'
UNION ALL SELECT '.xlsx'
UNION ALL SELECT '.ppt'
UNION ALL SELECT '.pptx'
UNION ALL SELECT '.zip'
UNION ALL SELECT '.tar.gz'
UNION ALL SELECT '.htm'
UNION ALL SELECT '.html'
)
SELECT T2.[extension]
, T1.[document_file_name]
FROM tbl T1
OUTER APPLY ( SELECT TOP 1 [extension]
FROM extensionTable
WHERE CHARINDEX([extension], T1.[document_file_name]) > 0
ORDER BY CHARINDEX([extension], T1.[document_file_name]) DESC, LEN([extension]) DESC
) T2
declare @filepath char(250) = 'c:\powersql\database\teste.txtdat'
Declare @NewExtesion Char(15) = 'Old'
-- @filepath char(250) = 'c:\powersql\database\teste.txtdat'
-- select len(@FilePath) = 33
-- Select Charindex('.', @filepath) = Len of Filepath before Extension
-- select RIGHT(rtrim(@filepath) ,len(@FilePath) - Charindex('.', @filepath) ) = txtdat (extension i would like to change)
-- select REPLACE(@filepath, RIGHT(rtrim(@filepath) ,len(@FilePath) - Charindex('.', @filepath)), 'xxx')
-- here i changed .txdat to xxx
-- below the full query
SELECT
CASE
WHEN @filepath LIKE '%.%'
THEN REPLACE(@filepath, RIGHT(rtrim(@filepath) ,len(@FilePath) - Charindex('.', @filepath)), @NewExtesion)
ELSE @filepath
END