【问题标题】:Querying path structure information using SQL Server使用 SQL Server 查询路径结构信息
【发布时间】:2011-06-22 23:56:58
【问题描述】:

假设我有一张包含很多路径的表格,例如:

  • \测试
  • \test\file.txt
  • \test\file2.txt
  • \file3.txt
  • \test\子文件夹\anotherfolder\test.txt

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

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

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

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

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

【问题讨论】:

  • 您的第一个问题.. 请问您到底是什么意思?
  • 您的预期结果不清楚。你能改述一下你在找什么吗?
  • 文件夹与表中的文件有何不同?仅仅是因为它总是包含其他文件/文件夹吗?或者它是一个文件夹,因为它没有扩展名?我的意思是,如果你有两行像\folder\subfolder\a\folder\subfolder\b,一个是文件,另一个是文件夹,你怎么知道哪一个是哪一个?
  • 你应该有一个先决条件,比如“文件夹总是以\结尾”或“文件总是有扩展名”
  • @Christian Sparre:抱歉,我似乎忽略了 Every item in the table knows if it is a directory or a file. 不知道你的意思。你是在谈论一些IsDirectory 专栏吗?

标签: sql sql-server tsql


【解决方案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;

【讨论】:

  • 非常感谢 Andriy,我认为这正是我想要的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2015-11-23
      • 2010-09-27
      • 1970-01-01
      相关资源
      最近更新 更多