考虑我有一个包含很多路径的表:
如何执行准确表示文件夹和文件结构的SELECT查询?
然后查询“test”文件夹应该给出
表中的每个项目都知道它是目录还是文件。
答案 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
这不是一个完整的解决方案,但希望它会有所帮助!