繁体   English   中英

"T-SQL 从列中获取文件扩展名"

[英]T-SQL Get File Extension Name from a Column

我有一个包含整个文件名的列的表,数据如下所示:

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 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
SELECT CASE 
         WHEN filepath LIKE '%.%' THEN RIGHT(filepath, Len(filepath) - 
                                                       Charindex('.', filepath)) 
         ELSE filepath 
       END FilePath 
FROM   tbl1 

演示

在查找特定扩展名以及处理确实有很多点的文本时,以下提供了更具体的方法。

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 

您可以通过这种方式获取文件扩展名:

select right('https://google.com/1.png', charindex('.', reverse('https://google.com/1.png') + '.') - 1)

您可以通过这种方式获取文件名:

select right('https://google.com/1.png', charindex('/', reverse('https://google.com/1.png') + '/') - 1)

回答为时已晚,但我找到了解决方案,如何从 sql 列获取图像或文件的扩展名,并在任何关键字或“\/”或“。”之后获取任何字符串....只需替换“。” 用你的关键字。

    SELECT SUBSTR("string_or_colname",(SELECT POSITION("." IN"string_or_colname")));

    # and if you wanted to get from starting then add 0 after 
    string_or_colname,then postion
    eg :
    SELECT SUBSTR("string_or_colname",1,(SELECT POSITION("." IN"string_or_colname")));
  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  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM