以适当的格式拆分字符串

时间:2013-09-05 06:34:28

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我的SQL Server数据库中有一个表,如

Table1

 srno   Filepath      
   1     C:\Folder1\Folder2\Folder3\Files\File_1.70837292036d41139fcf8fa6b4997d3c.pdf
   2     File_2.pdf
   3     C:\File_3.pdf
   4     File_4.70837292036d41139fcf8fa6b4997d3c.pdf
   5      
   6     NULL

我只想要srno,文件名。

如何才能通过简单查询获得文件名?

所需的输出,如

  srno    Filename
    1       File_1.pdf
    2       File_2.pdf
    3       File_3.pdf
    4       File_4.pdf
    5       
    6       NULL 

我有一个查询,但它没有显示正确使用(srno 1和4)

Select srno, CASE WHEN LEN(CHARINDEX('\', REVERSE(ISNULL(table1.Filepath,''))))= 1 THEN ISNULL(table1.Filepath,'') ELSE  REVERSE(SUBSTRING(REVERSE(ISNULL(table1.Filepath,'')), 1, CHARINDEX('\', REVERSE(ISNULL(table1.Filepath,'')))-1))  END  as Filename

1 个答案:

答案 0 :(得分:1)

反转sting并搜索第一个\的索引。然后使用此索引获取列的右侧。

SELECT RIGHT(Filename,PATINDEX('%\%',REVERSE(Filename))-1)

如果您想将File_1.70837292036d41139fcf8fa6b4997d3c.pdf变为File_1.pdf,那么您可以尝试以下操作,但它可能看起来很糟糕:

SELECT 
LEFT
(
    RIGHT
    (
        Filepath,
        CASE WHEN PATINDEX('%\%',REVERSE(Filepath)) > 0 
        THEN PATINDEX('%\%',REVERSE(Filepath))-1 
        ELSE LEN(Filepath) 
        END 
    ),
    CASE WHEN 
    PATINDEX
    (
        '%.%',
        RIGHT
        (
            Filepath,
            CASE WHEN PATINDEX('%\%',REVERSE(Filepath)) > 0 
            THEN PATINDEX('%\%',REVERSE(Filepath))-1 
            ELSE LEN(Filepath)  
            END
        )
    )>0
    THEN
    PATINDEX
    (
        '%.%',
        RIGHT
        (
            Filepath,
            CASE WHEN PATINDEX('%\%',REVERSE(Filepath)) > 0 
            THEN PATINDEX('%\%',REVERSE(Filepath))-1 
            ELSE LEN(Filepath)  
            END
        )
    )-1
    ELSE 0 END
)
+
RIGHT
(
    Filepath,
    CASE WHEN PATINDEX('%.%',REVERSE(Filepath)) > 0 
    THEN PATINDEX('%.%',REVERSE(Filepath)) 
    ELSE LEN(Filepath)  
    END
)