使用SQL Server查询路径结构信息

时间:2011-02-07 20:10:10

标签: sql sql-server tsql

考虑我有一个包含很多路径的表:

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

如何执行准确表示文件夹和文件结构的SELECT查询?

  • test(文件夹)
  • file3.txt(file)

然后查询“test”文件夹应该给出

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

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

请参阅此博客,了解convert_anything_to_tree_structures_in_php 该示例涵盖了类似的问题,并提供了php的解决方案 (并不意味着你必须用php做,但你可以采用这个想法/算法)

答案 2 :(得分: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

这不是一个完整的解决方案,但希望它会有所帮助!