2011-02-07 93 views
1

考虑我有一个表有很多像路径的路径结构信息:查询使用SQL Server

  • \测试
  • \测试\ file.txt的
  • \测试\ FILE2.TXT
  • \ file3.txt
  • \测试\子文件夹\ anotherfolder \ test.txt的

将如何执行SELECT查询ŧ帽子准确地代表文件夹和文件结构?

  • 测试(文件夹)
  • file3.txt(文件)

,然后查询 “测试” 文件夹中应该给

  • 子文件夹(文件夹)
  • 文件.txt(file)
  • file2.txt(file)

表中的每一项都知道它是一个目录还是一个文件。

+0

您的第一个问题..您是什么意思? – gbn 2011-02-07 20:21:46

+1

您的预期结果不清楚。你能改述你在找什么吗? – 2011-02-07 20:22:21

回答

1

下面是一个解决方案,假定表中有一列指示某个项目是否为文件夹。表格中的文件夹项目不应以'\'结尾。

DECLARE @dir varchar(300); 
SET @dir = '\test\'; 

SELECT 
    dir_item = CASE diritem WHEN '' THEN '.' ELSE dir_item END, 
    is_folder 
FROM (
    SELECT 
    dir_item, 
    is_folder 
    FROM (
    SELECT 
     dir_item = STUFF(path_item, 1, LEN(@dir), ''), 
     is_folder 
    FROM paths 
    WHERE SUBSTRING(path, 1, LEN(@dir)) = @dir 
) s 
    WHERE CHARINDEX('\', dir_item) = 0 
) s 
ORDER BY is_folder DESC, dir_item; 
0

看到这个博客约convert_anything_to_tree_structures_in_php
该示例涵盖了一个类似的问题,并提供了一个解决方案在PHP中。
(并不意味着你必须使用php,但你可能会采用这个想法/算法)

0

BW的PHP链接可以很好地检查出来,但是如果你想坚持使用SQL,试试这个UDF。给定一个输入字符串,它将它分割到指定的分隔符上,每个项目返回一行。

CREATE FUNCTION dbo.Split(@Input VARCHAR(MAX), @Separator CHAR(1)) 
    RETURNS TABLE 
AS RETURN 
    WITH A AS 
    (
    SELECT 1 AS Sequence, CAST(1 AS BIGINT) AS StartChar, CHARINDEX(@Separator, @Input) AS EndChar 
    UNION ALL 
    SELECT Sequence + 1, EndChar + 1, CHARINDEX(@Separator, @Input, EndChar + 1) 
    FROM A 
    WHERE EndChar > 0 
    ) 
    SELECT 
    Sequence, 
    SUBSTRING(@Input, StartChar, CASE WHEN EndChar = 0 THEN LEN(@Input) - EndChar ELSE EndChar - StartChar END) AS Value 
    FROM 
    A 

举例:SELECT * FROM dbo.Split('C:\Dir\File.ext', '\')回报:

Sequence Value 
1  C: 
2  Dir 
3  File.ext 

这不是一个完整的解决方案,但希望这将帮助!