2011-02-07 87 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 

這不是一個完整的解決方案,但希望這將幫助!