Запрос информации о структуре пути с использованием SQL Server - PullRequest
1 голос
/ 07 февраля 2011

Предположим, у меня есть таблица с множеством путей, таких как:

  • \ test
  • \ test \ file.txt
  • \ тест \ file2.txt
  • \ file3.txt
  • \ тест \ подпапка \ anotherfolder \ test.txt

Как бы выполнить запрос SELECT, который точно представляет структуру папок и файлов?

  • тест (папка)
  • file3.txt (файл)

и затем запрос к папке «test» должен дать

  • подпапка (папка)
  • file.txt (файл)
  • file2.txt (файл)

Каждый элемент в таблице знает, является ли он каталогом или файлом.

Ответы [ 3 ]

1 голос
/ 08 февраля 2011

Вот решение, где предполагается, что в таблице есть столбец, указывающий, является ли элемент папкой. Элементы папки в таблице не должны заканчиваться на '\'.

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 голосов
/ 08 февраля 2011

PHP-ссылку BW было бы неплохо проверить, но если вы хотите придерживаться 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

комплексное решение, но, надеюсь, оно поможет!

0 голосов
/ 08 февраля 2011

см. Этот блог о convert_anything_to_tree_structures_in_php .Пример охватывает аналогичную проблему и предоставляет решение в php.(не означает, что вы должны делать это с php, но вы можете принять идею / алгоритм)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...