【问题标题】:Get File Name Stored in SQL Server获取存储在 SQL Server 中的文件名
【发布时间】:2012-02-26 06:59:47
【问题描述】:

直截了当的问题:)

我在 SQL Server 中有一个这样存储的列:

FileName    Attachments_21046_123400100473.pdf

我需要获取文件扩展名之前的最后一段,在这种情况下,它将是123400100473

最后一段的字符大小可能不同,所以这里是 12 个字符,但有时可能是 15 个。

解决此问题的最佳方法是什么?

【问题讨论】:

    标签: sql sql-server-2005 select


    【解决方案1】:

    结合使用 T-SQL 的 CHARINDEXSUBSTRING 函数,您可以轻松实现这一目标。

    这有点 hacky,但仅取决于两个下划线和一个句点的存在。例如%_%_%.% 扩展名可以是任意长度,也可以是最终子串:

    编辑:已更新以处理变量下划线的出现:

    create function udfGetFileNameSubstring(@val as varchar(50))
    returns varchar(50)
    begin   
        --declare @val varchar(50)
        --set @val = 'Attachments_21046_123400100473.pdf'
    
        declare @uidx int
        -- establish the index of the 2nd underscore
        set @uidx = LEN(@val) - CHARINDEX('_', REVERSE(@val)) + 1
    
        declare @pidx int
        -- establish the index of the period
        set @pidx = CHARINDEX('.', @val) 
    
        return SUBSTRING(@val, @uidx + 1, @pidx - @uidx - 1)
    end
    
    -- usage:  SELECT dbo.udfGetFileNameSubstring(col_name) FROM table_name
    -- sample: SELECT dbo.udfGetFileNameSubstring('Attachments_21046_123400100473.pdf')
    -- OUTPUT: 123400100473
    

    T-SQL 当然可以缩写,我会将它包装在一个 UDF 中以便在您的查询中干净地使用。

    【讨论】:

    • 我翻阅了一些数据,有些字段有多个下划线。但是,这些是我可以忽略的记录。这不会影响您的解决方案,对吗?
    • @RogueSpear00:它会绊倒我的解决方案。我将对其进行调整以处理变量下划线。
    • @RogueSpear00:实际上很简单的修复。检查修改后的代码
    【解决方案2】:

    如果格式/长度始终相同.. 这可能是最简单的。

    select left(right(@Filename,16),12)
    

    【讨论】:

      【解决方案3】:
      begin
      DECLARE @a varchar(100) = 'Attachments_21046_123400100473.pdf';
      DECLARE @b varchar(100) = REVERSE(@a)
      SELECT SUBSTRING(@a, LEN(@a) - CHARINDEX('_', @b) + 2, CHARINDEX('_', @b) - CHARINDEX('.', @b) - 1)
      end;
      

      【讨论】:

        【解决方案4】:

        我不确定最后一段之前有多少个下划线,所以我反转字符串并找到第一个下划线...

        DECLARE @FileName VARCHAR(50)
        SET @FileName = 'Attachments_21046_123400100473.pdf'
        
        SELECT REVERSE(
                SUBSTRING(
                REVERSE(@FileName), 
                5, -- Length of extension + 1.
                CHARINDEX('_', REVERSE(@FileName)) - 5
            )
        )
        

        【讨论】:

        • 格式总是一样的,其实是“Attachments_IDNumber_SecondNumber.PDF”
        • @RogueSpear00 啊,好吧...我还是这样吧,因为即使我知道前导下划线的数量,它看起来也不漂亮。
        • @MichaelFredrickson:虽然这个解决方案可行,而且我确实喜欢 +1 的聪明之处,但请注意,它取决于文件扩展名,长度始终为三个字母。它将归档 .vb 或 .html 或任何其他非三个字母的扩展名。
        • @PaulSasik 好点保罗...我的回答很可爱,但您将代码放入 UDF 中可能是最强大的解决方案。
        【解决方案5】:

        SELECT SUBSTRING(f.FileName,0,CHARINDEX('.', f.FileName)) AS 'last_segment'

        【讨论】:

        • 您的答案会返回整个文件名。我正在尝试获取最后一段,请查看我在文件名示例下写的内容。
        • 那里应该有足够的内容供您解决。查看 tsql 字符串函数
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多